Git 管理分支
分支操作可以創造另一條線的發展。對fork過程分為兩個不同的方向發展,我們可以使用此操作。例如,我們發布了6.0版本的產品,我們可能要創建一個分支,使7.0功能的發展可以保持獨立從6.0 bug修複。
創建分支
使用Git分支<branch name> 命令創建新的分支。從現有的,我們可以創建一個新的分支。我們可以使用特定的提交或標簽作為一個起點。如果冇有提供任何具體的提交ID,然後分支將HEAD 創建作為一個起點。
[jerry@CentOS src]$ git branch new_branch [jerry@CentOS src]$ git branch * master new_branch
創建新的分支,Tom用 git branch命令列出可用的分支。 Git會顯示星號標記之前,當前檢出的分支。
下麵是創建分支操作的圖形表示
切換分支
Jerry 使用git checkout命令到分支之間切換。
[jerry@CentOS src]$ git checkout new_branch Switched to branch 'new_branch' [jerry@CentOS src]$ git branch master * new_branch
創建和切換分支的快捷方式
在上麵的例子中,我們使用了兩個命令來創建和切換分支。 Git提供checkout命令 -b選項,此操作將創建新的分支,並立即切換到新的分支。
[jerry@CentOS src]$ git checkout -b test_branch Switched to a new branch 'test_branch' [jerry@CentOS src]$ git branch master new_branch * test_branch
刪除分支
一個分支可以用git branch命令的-D選項被刪除。但在此之前,刪除現有的分支切換到其他分支。
Jerry 當前在test_branch 想要刪除該分支。於是,他分支和刪除分支切換,如下圖所示。
[jerry@CentOS src]$ git branch master new_branch * test_branch [jerry@CentOS src]$ git checkout master Switched to branch 'master' [jerry@CentOS src]$ git branch -D test_branch Deleted branch test_branch (was 5776472).
現在Git會顯示隻有兩個分支。
[jerry@CentOS src]$ git branch * master new_branch
重命名分支
Jerry 決定添加寬字符支持他的字符串操作項目。他已經創建了一個新的分支,但分支名稱是不恰當的。於是,他通過使用-m選項,其次是舊分支名稱和新分支名稱變更分支名稱。
[jerry@CentOS src]$ git branch * master new_branch [jerry@CentOS src]$ git branch -m new_branch wchar_support
現在git branch命令將顯示新分支名稱。
[jerry@CentOS src]$ git branch * master wchar_support
合並兩個分支
Jerry 實現函數返回字符串的長度為寬字符串。新代碼將看起來像這樣
[jerry@CentOS src]$ git branch master * wchar_support [jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git diff
上麵的命令會產生以下結果。
t a/src/string_operations.c b/src/string_operations.c index 8ab7f42..8fb4b00 100644 --- a/src/string_operations.c +++ b/src/string_operations.c @@ -1,4 +1,14 @@ #include <stdio.h> +#include <wchar.h> + +size_t w_strlen(const wchar_t *s) +{ + const wchar_t *p = s; + + while (*p) + ++p; + return (p - s); +}
測試後,他提交他的變化,並推到新的分支。
[jerry@CentOS src]$ git status -s M string_operations.c ?? string_operations [jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t string' [wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string 1 files changed, 10 insertions(+), 0 deletions(-)
注意傑裡推動這些變化的新分支,這就是為什麼他用wchar_support分支的名稱,而不是master分支。
[jerry@CentOS src]$ git push origin wchar_support <−−−−−−−−−−−−− Observer branch_name
上麵的命令會產生以下結果。
Counting objects: 7, done. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 507 bytes, done. Total 4 (delta 1), reused 0 (delta 0) To gituser@git.server.com:project.git * [new branch] wchar_support -> wchar_support
經過分支提交的變化,新分支會這個樣子。
Tom 好奇Jerry 在做什麼在他的私人分支,這就是為什麼他檢查日誌從wchar_support 分支。
[tom@CentOS src]$ pwd /home/tom/top_repo/project/src [tom@CentOS src]$ git log origin/wchar_support -2
上麵的命令會產生以下結果。
commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3 Author: Jerry Mouse <jerry@gitbook.net> Date: Wed Sep 11 16:10:06 2013 +0530 Added w_strlen function to return string lenght of wchar_t string commit 577647211ed44fe2ae479427a0668a4f12ed71a1 Author: Tom Cat <tom@gitbook.net> Date: Wed Sep 11 10:21:20 2013 +0530 Removed executable binary
通過查看提交的信息,Tom 意識到Jerry 實現寬字符strlen 函數,他希望同樣的功能集成到主分支。而不是重新實現他的分支合並到主分支,他決定采用傑裡的代碼。
[tom@CentOS project]$ git branch * master [tom@CentOS project]$ pwd /home/tom/top_repo/project [tom@CentOS project]$ git merge origin/wchar_support Updating 5776472..64192f9 Fast-forward src/string_operations.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
合並操作後的主分支會這個樣子。
現在wchar_support分支合並到主分支中我們可以驗證它的查看提交信息,通過查看修改成string_operation.c文件。
[tom@CentOS project]$ cd src/ [tom@CentOS src]$ git log -1 commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3 Author: Jerry MouseDate: Wed Sep 11 16:10:06 2013 +0530 Added w_strlen function to return string lenght of wchar_t string [tom@CentOS src]$ head -12 string_operations.c
上麵的命令會產生以下結果。
#include <stdio.h> #include <wchar.h> size_t w_strlen(const wchar_t *s) { const wchar_t *p = s; while (*p) ++p; return (p - s); }
經過測試,他把他的代碼更改到主分支。
[tom@CentOS src]$ git push origin master Total 0 (delta 0), reused 0 (delta 0) To gituser@git.server.com:project.git 5776472..64192f9 master −> master
重訂分支
Git 的 rebase命令的一個分支合並的命令,但不同的是,它修改提交的順序。
Git merge命令,試圖把從其他分支提交當前的本地分支的HEAD上。例如 本地的分支已經提交A-> B-> C-> D和合並分支已提交A-> B-> X> Y,則Git合並將當前轉換像這樣的本地分行A-> B-> C-> D-> X-> Y
Git 的rebase命令試圖找到當前的本地分支和合並分支之間的共同祖先。然後把修改提交的順序,在當前的本地分支提交中的本地分支。例如,如果當地的分支已提交A-> B-> C-> D和合並分支已提交A-> B-> X-> Y,Git衍合的類似A-> B轉換成當前的本地分支A−>B−>X−>Y−>C−>D
當多個開發人員在一個單一的遠程資源庫的工作,你不能在遠程倉庫提交修改訂單。在這種情況下,可以使用變基操作把本地提交的遠程倉庫之上的提交,可以推送這些變化。