git常用操作用例
1.建立本地倉庫並且與遠端分支相關聯
A. git init:本地倉庫初始化。//本質上生成了一個.git檔案
B. 在遠端倉庫建立好專案new-project,並且複製遠端倉庫的地址Git_Url
C. git remote add origin Git_Url//把遠端分支和本地分支相互關聯
D. git add .//把需要上傳的檔案從工作空間傳到stage快取區中
E. git commit -m "XXX"//給本次提交新增說明
F. git push -u origin master
注:第一次提交是遠端倉庫需要說明分支因此需要使用git push -u origin master,後面提交直接git push。
2.clone遠端分支專案
A.git clone Git_Url //clone遠端完整專案
git branch 顯示本地當前分支。
git branch -a 顯示本地以及遠端分支。
新clone的倉庫是隻有本地的master分支以及遠端的所有分支,如果需要在本地開發遠端倉庫的某個分支需要把本地分支和遠端分支再做一次對映。
B.git checkout -b 本地分支名 origin/遠端分支名 //將遠端git倉庫裡的指定分支拉取到本地(本地不存在並且遠端已經有的分支)。
C.git push --set-upstream origin 分支名 //推送本地分支到遠端倉庫
注:如果當前需求為把遠端的一個專案遷移到另外一個專案中,此時我們git clone後在該檔案目錄中顯示一個.git檔案,這個檔案中包含該專案所有的tags,branches,commit message等關聯資訊,這時再往新的遠端分支推送專案時候並不需要所謂的本地倉庫初始化等操作(git init),因為本身clone下來的專案就是一個倉庫。因此操作過程應該為:(1)git clone //clone專案(2)git remote add origin Git_Url//把遠端分支和本地分支相互關聯 (3) git push -u origin master //提交程式碼,並不需要git add、git commit 等操作,同時帶.git的專案自動匯入所關聯的所有tags,branches,commit message等關聯資訊。
3.一次完整的提交過程
A.git add 檔名//把檔案從本地工作空間提交到本地快取stage,可以提交多次不會產生commit_id
B.git commit -m "XXX" //把當前stage快取區中的所有內容一次性提交到本地分支,會生成新的commit_id。也就是所謂的多次add一次commit。
C.git push //把本地分支上的所有commit推到於此分支對應的遠端分支 master->origin/master
如果在git pull/push/clone中會遇到需要輸入username、password的我們為了方便重複輸入會採用兩種方式進行身份校驗。
一、sshd本地工作空間公鑰
二、在git pullhttp:// $username:[email protected]
C.git status //檢視本地工作區與本地分支的差異,簡言之就是檢視工作區域的狀態,有哪些檔案變更了。
當本地工作空間和本地快取stage都沒有更新或者所有的跟新已經push到遠端分支顯示"nothing to commit working directory clean"
D.git diff //檢視本地工作區與本地分支的差異,具體檔案的變更。
4.歷史版本資訊
A.檢視提交的版本資訊 git log;每個log顯示一行git log --pretty=oneline
B.git reset --hard commit_id //回退到某個版本
此時再使用git log檢視顯示的最新一條commit_id則是回退後的最新版本
此時檢視git status提示當前版本落後於origin/master遠端分幾個版本
此時使用git pull指令實質是本地和遠端的merge行為。(1)如果沒有對該版本做修改,git pull直接fast-forward到遠端origin/master的最新版本。(2)如果對老版本執行的單純的增量,git pull是執行遠端和本地的合併,注:單純的遞增是不會引起衝突,結果為遠端的最新版本再加上剛才的增量部分。(3)如果對老版本執行增刪改操作(都有),git pull 會產生衝突解決衝突後,再git add 、git commit 、git push。
注:衝突之前的commit也會是一次commit記錄並且推到遠端分支。
C.由於當前的最新git log顯示的舊版本的commit_id。因此如果想恢復到遠端分支origin/master的最新版本:(1)執行git pull 實現fast-forward。(2)使用git reflog檢視頭指標HEAD的變化情況,找到原來的回退前的commit_id。然後再執行git reset --hard commit_id回退到最新版本。
5.撤銷修改
A.git checkout -- 檔名 //把當前工作區的內容恢復到上一個狀態(上一個狀態:本地分支的最後一次commit狀態)。
B.git reset HEAD 檔名 //把當前stage快取區的內容送回到本地工作區,無論快取區有多少次add。
用例:在hi.sh檔案中本地新增"add something",git add 新增到快取區,本地新增"add anything";
(1)執行 git checkout -- hi.sh ,檔案變成只有"add something"的變更 //git checkout 只是撤銷了本地工作區域的變更;執行 git reset HEAD 檔名 ,把快取區的內容清空,但是檔案內容為"add something",當前檔案狀態為本地快取區為空,變更只存在於本地,因此再執行 git checkout -- 檔名,把本地的這次變更回退到本地分支的最後一次commit狀態。
(2)執行 git reset HEAD 檔名,把快取區的內容清空,檔案狀態為"add something" & "add anything"兩次本地變更,再執行git checkout -- 檔名,把本地的兩次變更回退到本地分支的最後一次commit狀態。
總結:git checkout 是撤銷本地變更的,無論是多少次變更,或者是從快取區回退回來的內容統一的退到本地分支的最後一次commit狀態(理解:已經從本地工作區域推到本地快取的內容不會回退)。 git reset 把當前stage快取區的內容送回到本地工作區,無論快取區有多少次add。
6.刪除檔案
A.刪除檔案一般流程(理解為一次提交和git add一樣) (1)rm 檔案 //本地刪除(2)git rm 檔案//把刪除提交到快取區(過程同git add) (3)git commit -m "XXX" (4) git push
B.檔案誤刪恢復。本地誤刪 rm 檔案:git checkout -- 檔名。
直接快取區誤刪 git rm 檔案:(1)git reset HEAD 檔名 //恢復快取區(2)git checkout -- 檔名 //恢復本地
7.分支管理
A.基本分支操作:(1)拉取本地不存在的遠端分支以及把本地的分支推到遠端倉庫的操作在第二小節中明確說明。(2)檢視本地分支git branch;檢視本地的遠端分支git branch -a(注:剛clone下來的專案中包含所有的遠端分支,並沒有直接對映到本地,需要本地建立分支且與本地遠端分支相互關聯[一般採用相同的名字,git自動做track])。(3)建立分支:方式一 git branch <branch_name> //建立分支; git checkout <branch_name>//切換到新建立的分支。 方式二 git checkout -b <branch_name> //建立分支並切換 (4)合併分支:git merge <branch_name>//把其他分支合併到當前分支(注:合併之前需要把分支上的修改先進行提交[git add、git commit],如果當前程式碼還不能提交採用git stash[後邊詳細介紹]保留當前變更後,再實現分支的合併) (5)合併後刪除無效分支(如果沒有合併就刪除,系統會提示。刪除本地分支git branch -d <branch_name>;刪除遠端分支 git push origin --delete <branch_name> (6)對於合併後的分支可以直接刪除,也可以再把主幹分支的程式碼向該分支merge,執行git checkout release ,執行git merge master,需要注意的是無論原master分支做了什麼變更,當前的主幹分支和release分支都處於merge狀態,因此當把主幹分支merge到release分支上面時"一定不會"產生complict衝突。(7)強制刪除分支(不需要合併等操作):git branch -D <branch_name>
B.分支衝突:
用例:在子分支上面有新的commit,在主幹分支上面也有新的commit,然後執行git merge release會發生衝突,衝突的資訊寫在發生衝突的資料夾中,手動處理衝突後,再次git add、git commit、git push
C.儲存工作現場並恢復:
用例:當前分支的變更還沒有commit,此時需要checkout到其他分支進行開發工作,需要儲存當前的工作現場,並需要在後邊做恢復。
方式一:儲存當前工作現場git stash;檢視快取列表git stash list;恢復某一次工作現場 git stash apply stash@{0};刪除這個現場記錄 git stash drop
方式二:儲存當前工作現場git stash;恢復某一次工作現場並且刪除記錄 git stash pop。
注:雖然可以儲存多次工作現場,但在實際工作這種情況很少見。
D.分支結構以及提交記錄(主要是看合併的結構):
git log --graph --pretty=oneline --abbrev-commit
為加強對於分支的理解上圖:
a.只有一個主幹master分支
git-br-initial
b.在master分支上切dev分支
git-br-create
c.在dev分支上有一次commit
git-br-dev-fd
d.git checkout master //切換到master分支
git-br-on-master
e.把dev合併到master分支
git-br-ff-merge
f.在master和feature分支上各自有一次新的commit
git-br-feature1
g.在master和feature分支上各自有一次新的commit,並別合併
git-br-conflict-merged
注:如果對於分支進行深度學習請參考Yuqi Chou推薦的https://github.com/pcottle/le...
8.標籤管理(首先checkout到需要打標籤的分支)
git tag <tag_name> //預設給最新的一次commit上面打標籤,後面可以跟任意一個commit_id。
git tag -a <tagname> -m "XXX"//加message的打標籤方式,預設給最新的一次commit上面打標籤,後面可以跟任意一個commit_id。
git tag //檢視本地所有標籤
git show <tag_name>//檢視標籤資訊
git push origin <tagname>//推送一個標籤到遠端倉庫
git push origin --tags//推送全部本地標籤到遠端倉庫
git tag -d <tagname>//刪除一個本地標籤
git push origin :refs/tags/<tagname>//刪除一個遠端倉庫標籤