分支
- 1. 分支名
- 2. 創建分支-git branch
- 3. 查看分支-git show-branch
- 4. 檢出分支
- 4.1 有未提交的修改時進行檢出
- 4.2 合并變更到不同的分支git checkout -m
- 5. 分離HEAD 分支
- 6.刪除分支
分支操作命令概覽
git branch # 列出版本庫中的分支
git branch -r # 列出遠程跟蹤分支
git branch -a # 列出版本庫中的分支和遠程跟蹤分支
git branch branchname1 # 新建一個branchname1 分支
git branch branchname3 [starting CID] # 基于starting CID新建 branchname3分支
git checkout branchname1 # 切換到branchname1分支(又叫檢出xxx分支)
git checkout -b newbranchname # 新建一個分支,并切換到該分支
git branch -d branchname2 [starting CID] # 刪除分支git checkout -- file1 # 檢出索引中的文件file1
git checkout commit_x -- file1 # 檢出commit_x中的提file1
分支是軟件項目中啟動一條單獨開發線的基本方法。
**分支-**動態名字,隨著每次的提交移動,跟隨你持續開發的過程。
**標簽-**靜態名字,不隨著時間的推移而改變,一旦應用不應該對它做任何改動,可用于標識擁有關鍵差異特征的提交點位。
可以使用同一個名字來命名分支和標簽,但是不推薦。
1. 分支名
默認分支是master(正在改為main),分支名字始終指向改分支上的最近提交版本。
使用層次分支- bug/pr-1023, bug/pr-17 這種層次分支支持通配符選擇。
路徑層次分支命名具有一些通用的規則,分支命名規則由 git check-ref-format 底層命令強制檢測。
2. 創建分支-git branch
在任何時候,版本庫中只有一個分支是活動的。活動分支決定了工作目錄里的檢出文件。
當需要把本地分支發布,需要顯示指明發布分支的名稱。
git branch prs/pr-1138 [starting commit] # 基于starting commit 新建 prs/pr-1138分支
# starting commit 缺省, 默認為當前分支上的最近提交
# git branch 創建分支后,需要顯示才會切換為
git branch 不帶分支名稱時,可用于列出版本庫中的分支名,帶星號的分支名標識當前的活動分支。
git branch # 列出版本庫中的分支
git branch -r # 列出遠程跟蹤分支
git branch -a # 列出版本庫中的分支和遠程跟蹤分支
3. 查看分支-git show-branch
按時間順序\)列出對一個或多個分支有貢獻的提交。同樣可以帶-r,和-a兩種可選參數。 \
git show-branch # 該輸出被破折號分為兩個部分,.....
* [alternate] Initial 3 line file # 方括號中的為分支名,后面跟著最近一次提交! [master] Another file # * 標識當前活動分支上的提交
-- # + 表示提交在一個分支中【說的什么話?】+ [master] Another file # - 表示一個合并提交
*+ [alternate] Initial 3 line filegit show-branch bug/pr-1 bug/pr-2 # 查看兩個分支的提交信息,支持通配符匹配更多的分支
4. 檢出分支
工作目錄一次只能反應一個分支。git checkout用于切換不同的分支。它改變了工作樹文件和目錄結構來匹配切換分支。git checkout branchname 實現改了通過分支名來檢出分支頭部。
4.1 有未提交的修改時進行檢出
工作目錄里未被追蹤的文件的目錄始終會被置之不理,git不會刪除或修改他們。如果一個文件在本分支上修改了,但是沒有被新分支追蹤,git 會發出錯誤信息,并拒絕檢出到目標分支。
$ git checkout dev
error: Your local changes to the following files would be overwritten by checkout:git_checkout_test
Please commit your changes or stash them before you switch branches.
Aborting$ cat git_checkout_test
git checkout test
$ git diff git_checkout_test
diff --git a/git_checkout_test b/git_checkout_test
index e69de29..9747ad6 100644
--- a/git_checkout_test
+++ b/git_checkout_test
@@ -0,0 +1 @@
+git checkout test$ git show dev:git_checkout_test # 查看另一個分支中的文件
fatal: path 'git_checkout_test' exists on disk, but not in 'dev'
解決方法
1.提交新的更改到當前分支
2.提交新的更改到另一分支:
a). stash
b). 合并變更到不同的分支。
4.2 合并變更到不同的分支git checkout -m
-m 選項將 本地修改合并到目標分支的工作目錄中,并留下合并沖突指示[可能會沒有],我們需要進一步解決存在的沖突。
% git checkout dev
error: Your local changes to the following files would be overwritten by checkout:git_checkout_test
Please commit your changes or stash them before you switch branches.
Aborting
% git checkout -m dev
A git_checkout_test
M hello.txt
Switched to branch 'dev'
# dev 分支上修改文件,再想切換回master分支, 執行合并切換操作不行啊。
% git checkout -m master
fatal: cannot continue with staged changes in the following files:
git_checkout_test hello.txt
在master 分支中編輯文件,突然意識到需要將所有的修改提交到dev2分支上,那么就新建并切換到新的分支上。
% git checkout -b dev2
Switched to a new branch 'dev2'
% git status
On branch dev2
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: git_checkout_testno changes added to commit (use "git add" and/or "git commit -a")
5. 分離HEAD 分支
git checkout branchname 實現改了通過分支名來檢出分支頭部。git checkout 可以檢出任何提交,如果檢出的提交不是該分支的頭部,Git 會創建一個分離的HEAD(detached HEAD),以下的情況,Git都會創建一個分離的HEAD:
- 檢出的提交不是分支的頭部
- 檢出一個追蹤分支
- 檢出一個標簽引用的提交
- 使用git bisect 操作
- 使用git submodule update命令
如果1: 想要保留在detached HEAD狀態下的開發內容,那就新建一個分支。
git checkout -b new_branch
如果2: 只是在detached HEAD狀態下驗證某些東西,不想保存相關操作,直接切換回某個一分支即可。
git checkout branchname
6.刪除分支
git branch -d branchname2
默認規則1:不能刪除當前分支。
默認規則2: 不會允許刪除一個 包含不存在當前分支提交的分支。就是說,要刪除的分支不是當前分支的祖先,那么刪除該分支將會造成某些開發不可留。但是可以通過 -D強制刪除,可以選擇在刪除之前進行一次合入操縱。
git branch -D branchname2