GIT速查手冊

為什么80%的碼農都做不了架構師?>>> ??hot3.png

一、GIT

1.1 簡單配置

git是版本控制系統,與svn不同的是git是分布式,svn是集中式

配置文件位置

# 配置文件
.git/config 當前倉庫的配置文件
~/.gitconfig 全局配置文件# 查看所有配置項
git config --list

友好的查看日志

# 設置別名
# 友好的查看日志
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all"git log --decorate --oneline --graph --all
git lg

設置用戶名和郵箱

# 設置用戶名和郵箱
git config --global user.name "xxx"
git config --blobal user.email "xxx@xxx.com"

1.2 工作區和暫存區

工作區(Working Directory)是當前文件夾,當前文件夾下的.git文件夾是版本庫(Repository)。版本庫里有很多東西,其中有

  1. 最重要的就是暫存區(stage或index)
  2. Git為我們自動創建的第一個分支master
  3. 指向master的一個指針叫HEAD

工作區--暫存區(stage/index)--當前分支(master)--遠程庫

關系圖

版本說明

HEAD 當前版本
HEAD^ 上一版本
HEAD^^ 上上版本
HEAD~100 往上100個版本

1.3 add/commit/diff/reset

add命令

commit命令

diff命令

reset

二、常用命令

2.1 init/add/commit/status/log

init

cd learngit
git init# 在某目錄下執行命令后,該目錄會生成一個.git的隱藏文件夾,這個目錄就是一個版本庫了
# 所有版本控制系統只能跟蹤文本文件的發動
# 如TXT文件中刪除了第4行,圖片等二進制文件作為一個整體
# 統一用UTF-8編碼

add

# 添加一個文件到暫存區(Stage)
vi readme.txt
git add readme.txt

commit

# 將文件提交給HEAD
git commit -m 'wrote a readme file'# 不產生新快照的提交
git commit --amend  

查看狀態

git status
# 通過該命令可以清楚的了解當前版本庫中的文件處于什么狀態

查看歷史

git log
git log --pretty=oneline
git lg
# 自定義的一個別名,參照 簡單設置git reflog
# 查看執行的每一條命令

2.2 文件對比

準備

# 工作區的readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
# 暫存區的readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files by stage.
# master的readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.

比較工作區與暫存區中的文件

git diff -- readme.txt

比較工作區與版本庫中的文件

git diff HEAD -- readme.txt

比較暫存區與版本庫

git diff --cached HEAD

比較兩個歷史快照

git diff id1 id2

2.3 版本回退

有如下幾個版本:

查看歷史記錄是這樣的:

回退到指定版本:

git reset HEAD^/comment_id
# comment_id,ID號,前7位,可以通過git reflog和git log命令進行查看 

版本庫覆蓋xxx

# 工作區----暫存區(stage)----版本庫(HEAD)----服務器
# 三種模式soft/mixed/hard,默認是mixed# 版本庫里上一版本覆蓋最新版本
git reset --soft HEAD^
# 1.移動HEAD的指向,將其指向上一個快照# 版本庫上一版本覆蓋最新版本和暫存區
git reset --mixed HEAD^
# 1.移動HEAD的指向,將其指向上一個快照
# 2.將HEAD移動后指向的快照回滾到暫存區域# 版本庫上一版本覆蓋最新版本和暫存區和工作區
git reset --hard HEAD^
# 1.移動HEAD的指向,將其指向上一個快照
# 2.將HEAD移動后指向的快照回滾到暫存區域
# 3.將暫存區域的文件還原到工作目錄

暫存區覆蓋工作區

# 暫存區的內容覆蓋工作區(丟棄工作區的修改)
# 撤銷工作區的修改
# 沒有--,該命令就是切換分支的命令了
git checkout -- readme.txt

版本庫覆蓋暫存區

# 版本庫的內容覆蓋暫存區(丟棄暫存區的修改)
# 撤銷暫存區的修改
git reset HEAD readme.txt

2.4 暫存區修改

這樣一種場景:工作區,暫存區,版本庫里內容一樣,類似.project類似這種eclipse的項目配置文件也存在于版本控制中,現在把.project這類文件加入到忽略名單后

# 這個命令是把.project從暫存區中刪除
git rm --cached .project
# 提交暫存區
git commit -m "delete .project"

2.5 刪除/重命名

# 只能刪除工作區和暫存區中的文件
git rm filename# git rm readme.txt與如下兩個命令等價
rm readme.txt
git add readme.txt# 如果工作區和暫存區中的文件內容不同時,下面兩個命令可把兩個都刪除
git rm -f filename
git rm --cached filename# 重命名
git mv filename1 filename2

三、遠程倉庫

3.1 免登錄設置

Windows下生成ssh-keygen

1.安裝Git
2.打開Git Bash
3.輸入 ssh-keygen -t rsa -C "your email"

Linux下生成ssh-key

ssh-keygen -t rsa -C "your email"
cat ~/.ssh/id_rsa.pub
# ~/.ssh/id_rsa  這是私鑰
# ~/.ssh/id_rea.pub  這是公鑰# 驗證
ssh -T git@git.oschina.net

3.2 遠程庫命令

關聯遠程倉庫

# 把本地倉庫與遠程倉庫相關聯
git remote add origin git@github.com:yysue/learngit.git
# yysue:github賬戶名或gitee賬戶名
# origin:遠程庫的名字,這是Git默認的叫法# 關聯分支
git branch --set-upstream-to=origin/master master
# 將本地的master分支與遠程origin庫的master分支關聯# pull,第一次pull加--allow-unrelated-histories
# https://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories-on-rebase
git pull --allow-unrelated-histories

直接修改配置

# 當前版本庫目錄下
$ cat .git/config
[core]repositoryformatversion = 0filemode = falsebare = falselogallrefupdates = truesymlinks = falseignorecase = true
[remote "origin"]url = git@git.oschina.net:yysue/mysqldba.gitfetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]remote = originmerge = refs/heads/master

查看遠程庫

git remote -v

推送到遠程庫

git push -u origin master
# 把本地所有內容推送到遠程庫上
# -u參數,不但會把本地master分支推送到遠程master分支,還會把本地master分支與遠程master分支相關聯
# 第一次推送用-u,以后用就可以不用了
git push origin master

從遠程庫抓取

git pull origin master

從遠程庫克隆

git clone git@github.com:h2o1k/gitskills.git        ssh協議,速度快
git clone https://github.com/h2o1k/gitskills.git    https協議

遠程倉庫強制覆蓋本地文件

git fetch --all  
git reset --hard origin/master 
git pull

四、分支管理

4.1 branch/checkout/merge

查看master分支

master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點

創建并切換到dev分支

# 查看當前分支的命令
git branchgit checkout -b dev
# -b 表示創建并切換,與下面兩條命令等價
git branch dev
git checkout dev# 再查看一下分支
git branch

在dev分支提交

vi dev.txt
Creating a new branch is quick.git add dev.txt
git commit -m "add dev.txt"

切換到master分支

git checkout master

dev合并到master

git merge dev -m "merge dev"
# merge合并指定分支到當前分支,
# so,必須在master分支下執行上述命令

保留分支信息的合并

git merge --no-ff -m "merge" dev
# --no-ff會保留分支信息

通常,分支合并時,Git會用Fast forward模式,這種模式下,刪除分支后,會丟失分支信息,禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息

刪除dev分支

git branch -d dev

產生沖突

master分支和feature1都有新的提交

解決沖突

編輯沖突文件,然后再添加、提交、合并,最后刪除分支feature1

查看日志

分支管理策略

4.2 stash

我們有時會遇到這樣的情況,正在分支a上開發一半,然后分支b上發現Bug,需要馬上處理。

這時候分支a上的修改怎么辦呢,git add 是不行的,有的git客戶端版本會提示還有add過的文件沒提交不能切換分支,有的git客戶端版本會把修改帶到b分支。

git stash 就是解決這個問題,它把當前工作區的修改和git add的內容都保存到一個地方,然后git reset HEAD,使工作區回到上一次提交,處于干凈狀態。然后就可以很放心的切到另外的分支b干活了。

git stash save “先給我保存一下,我要去別的分支修bug”
git stash list
# 切換到其他分支去修改bug
# ...
# 再切換到打stash的分支
git stash pop
# git stash pop相當于執行git stash apply和git stash drop
git stash apply stash@{num}

4.3 rebase

有的時候我們在一個分支a開發的時候,master已經進入了很多修改,這時候如果把a的修改提交上去,可能就會跟主干有沖突,需要在主干解決沖突才能提交,這樣比較難看。

這時候git rebase就有用了,git rebase BRANCH_NAME可以把BRANCH_NAME分支的修改帶到當前分支來,這樣當前分支就有了BRANCH_NAME分支的所有內容,這樣在當前分支開發的內容提交以后不會跟BRANCH_NAME有沖突,沖突在當前分支就可以解決。

4.4 小技巧

可以取消已經提交的commit,一般我們只用git reset HEAD^。因為每個分支可能開發過程中為了保存過程以便回溯會有很多commit,但是我們要求進入主干時,每個功能和bugfix只能有一個提交,因此可以先用git reset退回到最早的commit,然后把自己的修改最后打包成一個commit,再去跟主干合并。

利用這兩個命令,我們可以很好的管理我們的MySQL開發。我們只有一個master分支作為主干,不允許在主干上直接開發。每個同學根據feature和bug的issue建立分支,然后在分支上開發,不管開發過程中有多少個commit,我們要求最終提交每個bugfix或feature只能有一個提交。因此每個同學完成開發后,都需要git reset 退到最早的commit,git stash save寶存一下自己的修改,然后git checkout master; git pull拖一下最新的主干,然后返回自己的分支,再做git rebase master,把當前分支推進到主干,最后git stash pop彈出修改,有沖突則在當前分支解決,再git push。

# 此時commit id為a37b9ff,切換到開發版本dev
git checkout -b dev
# 實現了一個功能xxx,期間多次commit
...
# xxx開發完畢后,合并到主分支要求只有一個commit
git reset a37b9ff
git stash save "保存開發功能xxx的修改"
git checkout master
git pull
git checkout dev
git rebase master
git stash pop
# 處理沖突
git add .
git commit -m "功能xxx"
git checkout master
git merge --no-ff -m "merge 功能xxx" dev

4.5 常用分支命令

# 查看當前分支
git branch   
# 創建分支dev
git branch dev  
# 切換到分支dev
git checkout dev 
# 創建并切換到分支dev
git checkout -b dev 
# 合并指定分支(dev)到當前分支
git merge dev 
# 刪除分支dev, 如果分支有未提交的這樣刪除不了
git branch -d dev
# 強制刪除
git branch -D dev 
# 查看分支合并情況
git log --pretty=oneline --graph --abbrev-commit
# master轉gh-pages
# 創建一個沒有父節點的分支gh-pages
git checkout --orphan gh-pages

五、標簽管理

5.1 常用標簽命令

# 切換到要打標簽的分支上
git branch
git checkout master# 打標簽
git tag v1.0# 默認標簽是打在最新提交的commit上,也可以指定commit id
# git log --pretty=oneline --abbrev-commit
git tag v0.9 <commit id># 查看標簽列表
git tag# 查看某標簽信息
git show v0.9# 標簽加注釋
git tag -a v0.1 -m "version 0.1 released" 2428164# 可以用PGP簽名標簽
git tag -s v0.2 -m "signed version 0.2 released" fac145a# 刪除標簽
git tag -d v0.1# 把標簽推送到服務器
git push origin v1.0# 一次性推送全部尚未推送的本地標簽
git push origin --tags# 刪除遠程庫標簽
# 先刪除本地標簽
git tag -d v0.9
# 再刪除遠程庫標簽
git push origin :refs/tags/v0.9

六、使用GitHub

6.1 Fork/克隆

七、自定義Git

# 如果一個jar文件已經加到忽略文件里邊了
# 想把一個jar文件添加到版本庫
git add -f aaa.jar

八、問題

8.1 注釋輸入不了中文了

# Git安裝目錄 D:\Program Files\Git
# 編輯如下文件D:\Program Files\Git\etc\inputrc
# 確保如下行的配置如下,就可以保證輸入中文注釋了
set output-meta on
set convert-meta off

九、參考

  • Git教程-廖雪峰
  • 一些Git操作的技巧

轉載于:https://my.oschina.net/yysue/blog/1635600

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278289.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278289.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4-3邏輯非運算符及案例 4-4

創建類 LoginDemo3 這里取反 !(n%30) package com.imooc.operator; import java.util.Scanner;public class LoginDemo3 {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("請輸入一個整數");Scanner scnew Scanner(…

assistant字體_如何使用Google Assistant設置和致電家庭聯系人

assistant字體Google谷歌Google Home and Nest smart speakers and displays allow you to make calls without using your phone. By setting up “Household Contacts,” anyone in your home can easily call friends and family members with Google Assistant-enabled dev…

php隊列使用

由于項目中在修改產品的同時要同步關聯水單,刪單&#xff0c;客保 等等數據。所以不可能等待所有都執行完畢以后再給客戶端反饋。所以自己用寫了個隊列。在這里曬出來代碼&#xff0c;以供大家參考。(項目中用到的是tp,所以在這里用tp作為演示) 思路 1&#xff0c;需要用到隊列…

Accoridion折疊面板

詳細操作見代碼&#xff1a; <!doctype html> <html><head><meta charset"UTF-8"><title></title><meta name"viewport" content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scal…

skype快捷鍵_每個Skype鍵盤快捷鍵及其用法

skype快捷鍵Roberto Ricca/Shutterstock羅伯托里卡/ ShutterstockGet familiar with Skype’s unique keyboard shortcuts that will allow you to quickly change your settings, alter your interface, and control your communications. Use these hotkeys and become a Sky…

習慣需要堅持

近期會把本地的資料上傳分享出來&#xff0c;好久沒更新自己的內容了&#xff0c;以后會不斷的更新哦。轉載于:https://blog.51cto.com/haohao1010/2087494

YouTube鍵盤快捷鍵:速查表

Google’s video website wouldn’t be complete without all sorts of useful buttons and hidden commands that aren’t immediately obvious. Use this hotkey cheat sheet to quickly navigate YouTube and gain better control over your video browsing experience. 如果…

第五章 課本題目

例 5.1 使用單分支條件結構輸出兩個數的最大值。 #include<stdio.h> int main() { int a,b,max; scanf("%d,%d",&a,&b); if(a>b) maxa; if(a<b) maxb; printf("max%d\n",max); return 0; } 例 5.2 用雙分支條件語句求最大值。 #includ…

MySQL服務讀取參數文件my.cnf的規律研究探索

在MySQL中&#xff0c;它是按什么順序或規律去讀取my.cnf配置文件的呢&#xff1f;其實只要你花一點功夫&#xff0c;實驗測試一下就能弄清楚&#xff0c;下面的實驗環境為5.7.21 MySQL Community Server。其它版本如有不同&#xff0c;請以實際情況為準。 其實&#xff0c;MyS…

將組策略編輯器添加到控制面板

If you find yourself using the Group Policy Editor all the time, you might have wondered why it doesn’t show up in the Control Panel along with all the other tools. After many hours of registry hacking, I’ve come up with a registry tweak to let you do ju…

cookies和session區別

cookies和session區別 1、Cookie和Session都是會話技術&#xff0c;Cookie是運行在客戶端&#xff0c;Session是運行在服務器端。 2、Cookie有大小限制以及瀏覽器在存cookie的個數也有限制&#xff0c;Session是沒有大小限制和服務器的內存大小有關。3、Cookie有安全隱患&#…

Exchange Server 2016管理系列課件50.DAG管理之激活數據庫副本

激活郵箱數據庫副本是將特定被動副本指定為郵箱數據庫的新主動副本的過程。我們將此過程稱為數據庫切換。數據庫切換過程是指卸除當前的活動數據庫&#xff0c;然后在指定的服務器上將相應的數據庫副本作為新的活動郵箱數據庫副本進行裝載。成為活動郵箱數據庫的數據庫副本必須…

常見設計模式 (python代碼實現)

1.創建型模式 單例模式 單例模式&#xff08;Singleton Pattern&#xff09;是一種常用的軟件設計模式&#xff0c;該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中&#xff0c;某個類只能出現一個實例時&#xff0c;單例對象就能派上用場。 比如&#…

記錄一次解決httpcline請求https報handshake_failure錯誤

概述 當使用httpclinet發起https請求時報如下錯誤&#xff1a; javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failureat com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)at com.sun.net.ssl.internal.ssl.Alerts.getSSLExcep…

桌面程序explorer_備份Internet Explorer 7搜索提供程序列表

桌面程序explorerIf you are both an IE user and a fan of using custom search providers in your search box, you might be interested to know how you can back up that list and/or restore it on another computer. Yes, this article is boring, but we’re trying to…

C++內聯函數(inline function)

c從c中繼承的一個重要特征就是效率。假如c的效率明顯低于c的效率&#xff0c;那么就會有很大的一批程序員不去使用c了。 在c中我們經常把一些短并且執行頻繁的計算寫成宏&#xff0c;而不是函數&#xff0c;這樣做的理由是為了執行效率&#xff0c;宏可以避免函數調用的開銷&am…

GreenPlum數據庫故障恢復測試

本文介紹gpdb的master故障及恢復測試以及segment故障恢復測試。 環境介紹&#xff1a;Gpdb版本&#xff1a;5.5.0 二進制版本操作系統版本&#xff1a; centos linux 7.0Master segment: 192.168.1.225/24 hostname: mfsmasterStadnby segemnt: 192.168.1.227/24 hostname: ser…

書評:Just the Computer Essentials(Vista)

Normally we try and focus on articles about how to customize your computer, but today we’ll take a break from that and do a book review. This is something I’ve not done before, so any suggestions or questions will be welcomed in the comments. 通常&#x…

RxSwift筆記七其他操作符

簡介 git地址: https://github.com/ReactiveX/RxSwift參考資料:http://t.swift.gg/d/2-rxswiftReactiveX是通過可觀察的流實現異步編程的一種API&#xff0c;它結合了觀察者模式、迭代器模式和函數式編程的精華&#xff0c;RxSwift 是 ReactiveX 編程思想的一種實現。 復制代碼…

python學習

為了學會能學&#xff0c;不負時間&#xff0c;為了那簡練的美&#xff01; 為了一片新天地。 /t 對齊 python : # 99乘法表i 0while i < 9 : i 1 j 0 while j < i : j 1 print(j ,* , i,"" , i*j , end\t) #空格不能對齊 制表符…