git分支類似於某一個模塊,等到所有模塊開發完畢時,最后聚合在一起形成一個項目。而分支之間一般是不會受影響的。
git 分支的基本操作:
-
git branch branchname 表示創建分支,新建分支的命令是基於當前所在分支創建的,創建新分支的內容和當前所在分支的內容是完全一樣的。
-
git checkout branchname 表示切換到指定分支上。
-
git checkout -b branchname 表示創建分支並且切換到分支。
-
git merge branchname表示合並分支到主分支master。在執行這個操作的時候,要先切換到master分支,然后在執行該命令。
-
git branch 表示本地分支列表,git 默認是在master分支上的,當前分支前面會有一個*號。
-
git branch -r 表示查看遠程分支列表。
-
git branch -d branc_name 表示刪除本地分支。 git branch -D branch_name(強制刪除分支)。
-
git push origin :branch_name 表示刪除遠程分支。
-
把分支推送到遠程倉庫:git push origin branch_name ,如果想要給遠程分支取另一個名稱的話:git push origin branch_name:branch_othername。
-
遠程有個分支,而本地沒有,將遠程分支遷到本地:git checkout branch_name origin/branch_name。同樣的,將遠程分支遷到本地並且切換到該分支:git checkout -b branch_name origin/branch_name。
-
merge和rebase
merge和rebase都有合並分支的作用,但是二者又有一些區別。
例如現在有一個分支A,現在要把A分支合並到master分支,可以如下操作:
git checkout master
git merge A
先切換到master分支,在進行合並。利用rebase也一樣能完成同樣的功能。
git checkout master
git rebase A
執行完畢也一樣完成了分支的合並。
他們的區別參見:https://blog.csdn.net/liuxiaoheng1992/article/details/79108233
解決分支合並時的沖突
有時候分支在合並的時候會出現沖突,這個時候需要先解決沖突然后在合並。解決沖突就是手動編輯我們需要的內容。當不存在沖突時在合並即可。
當Git無法自動合並分支時,就必須首先解決沖突。解決沖突后,再提交,合並完成。解決沖突就是把Git合並失敗的文件手動編輯為我們希望的內容,再提交。
git log --graph --pretty=oneline --abbrev-commit 可以查看分支合並的情況。
通常一般在合並分支時git采用的是Fast-forward模式,即快速合並分支,但這種模式下,刪除分支后,會丟掉分支信息。
如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev 注意:--on-ff表示禁用fast-forward模式,因為會生成一個新的commit所以需要把描述信息-m加上。
合並分支時,加上--no-ff參數就可以用普通模式合並,合並后的歷史有分支,能看出來曾經做過合並,而fast forward合並就看不出來曾經做過合並。
git的分支特別強大,一般master主分支都是比較穩定的,開發的話都是在dev分支上進行,當每一個功能模塊開發完成過后只需要將它合並到dev中即可,如果沒有問題了可以將dev合並到master分支上。
當需要緊急修復bug的時候,而你正在開發新的功能,功能還沒有開發完成,但是有bug需要立馬處理,這時怎么辦呢? 別擔心,你只管切換分支到需要修改bug的分支去修復bug就好,其他的工作交給stash來完成。
stash命令:用於暫時存儲你沒有完成的工作,相當於一個管家,讓他先幫你把沒有完成的工作先保管起來,等你bug修復完成了回來繼續做原來沒有做完的工作。
執行git stash,就把沒有完成的工作暫時存儲起來了,在執行git status會發現工作區很干凈。
想要看暫存區里面有多少工作沒有完成可以輸入git stash list 查看列表。
當你把bug修復完成了,想要繼續先前的工作,有兩種方式恢復。
方式一:git stash apply,執行完成后你以前暫存的文件就已經恢復了,像什么都沒有發生一樣。緊接着就要刪除暫存區記錄,git stash drop這樣就把記錄刪除了。
方式二:git stash pop,它與apply的區別是他不但幫你恢復了暫存文件,而且還幫你刪除了暫存區記錄。
drop 只是刪除一條記錄,可以跟參數stash_id刪除指定的文件,不指定的話刪除最近的文件,而想要清空的話,可以使用git stash clear。表示將暫存區的所有記錄全部清空。
當暫存區有很多條記錄時,你可指定恢復那一條內容:git stash apply stash@{0}
如下圖所示:
多人協作時對遠程倉庫的操作
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin。
- git remote 表示查看遠程倉庫有哪些分支
- git remote -v表示查看遠程倉庫的詳細信息,可以查看遠程分支哪些可以抓取和推送的分支
fetch表示可以抓取的倉庫,push表示可以提交的倉庫。 - git remote show origin 可以查看遠程分支詳細信息,比如當前在哪個分支,本地哪個分支和遠程分支進行了關聯等等。
- git log --oneline --decorate 命令查看各個分支當前所指的對象。
- git branch 可以查看當前的分支列表。
- git branch -v 可以查看每一個分支的最后一次提交信息。
- --merged 與 --no-merged 這兩個有用的選項可以過濾這個列表中已經合並或尚未合並到當前分支的分支。 如果要查看哪些分支已經合並到當前分支,可以運行 git branch --merged。
- 如果要同步你的工作,運行 git fetch origin 命令。 這個命令查找 “origin” 是哪一個服務器(在本例中,它是 git.ourcompany.com),從中抓取本地沒有的數據,並且更新本地數據庫,移動 origin/master 指針指向新的、更新后的位置。
- git push origin master 表示推送分支,將本地分支推送到遠程倉庫。如果需要推送其他分支,將master換成其他的即可,origin是表示遠程倉庫的名字。
- git pull 表示將遠程倉庫抓取到本地
一般通常情況下,都是先pull在push。
多人協作的工作模式通常是這樣:
首先,可以試圖用git push origin
如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合並;
如果合並有沖突,則解決沖突,並在本地提交;
沒有沖突或者解決掉沖突后,再用git push origin
如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream-to=origin/branchname
例如git branch --set-upstream-to=origin/dev dev,創建一個dev分支並且和遠程dev分支建立連接關系。
關於分支沖突,以及分支的處理可以參見:
https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320
git的標簽相關操作
git中的標簽和分支差不多的,它也是指向的是某一次commit提交,標簽的好處就是可以讓你迅速回到某一個版本,標簽也就是用來標記版本信息的,例如當前版本是v1.0,那么就在master上打一個標簽。打標簽需要切換到對應的分支。默認的標簽是打在最近最新的一次commit上,如果某一次commit之后沒有打標簽,只需要通過日志找到commit_id即可。
在git中標簽有兩種:輕量標簽和附注標簽。一個輕量標簽很像一個不會改變的分支 - 它只是一個特定提交的引用。然而,附注標簽是存儲在 Git 數據庫中的一個完整對象。 它們是可以被校驗的;其中包含打標簽者的名字、電子郵件地址、日期時間;還有一個標簽信息;並且可以使用 GNU Privacy Guard (GPG)簽名與驗證。 通常建議創建附注標簽,這樣你可以擁有以上所有信息;但是如果你只是想用一個臨時的標簽,或者因為某些原因不想要保存那些信息,輕量標簽也是可用的。
- git tag tag_name 表示創建一個標簽,標簽總是指向一個commit(這樣創建的標簽就是輕量標簽)。
- 還可以創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字。例如:git tag -a tag_name -m"說明文字" |commit_id。(這樣創建的標簽就是附注標簽)
- git show tag_name可以查看標簽的一些信息。
- 要切換到某個標簽,可以使用 git checkout 標簽名。
- 直接使用git tag表示查看倉庫的標簽信息。
- 對指定某一次提交打標簽git tag tag_name commit_id。即可。
- 需要注意的是標簽不是按時間順序列出,而是按字母排序的。可以用git show
查看標簽信息。如果沒有標簽信息就是查看最近的一次提交信息。 - git tag -d tag_name 表示刪除某一個標簽。
- git push origin
表示推送某個標簽到遠程。 - git push origin --tags 表示一次推送所有未推送的標簽到遠程。
- 如果想刪除遠程標簽,需要先刪除本地標簽然后在刪除遠程標簽。
git tag -d tag_name
git push origin :refs/tags/tag_name
以上就是git 分支和標簽的基本操作