1. 當前分支落后拉取后,整理commit,使得提交歷史為直線
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
其實--rebase的目的只有兩個:
1.讓多個人在同一個分支開發的提交節點形成一條線,而不是多條線
2.讓你提交的commit在該分支的最前面
當push被reject的時候,可以用 git pull --rebase 拉取內容,將提交記錄保持一條直線
git pull --rebase時候,不能有modified狀態的文件,可以有Untracked files。modified狀態的文件,可以commit或者stash一下,通常的操作有:
$ git stash $ git pull --rebase $ git push $ git stash pop
2. 別的分支合並到master,先整理為直線,再合並
1. 開辟特性分支 git checkbox -b feature
2. 在feature分支提交commit
3. 在feature git reabse -i 合並多個commit為一個,簡化提交歷史。這樣可以在git rebase時候減少沖突解決次數。
4. 在feature git pull origin master --rebase (相當於git fetch origin master, git rebase origin/master)
將master最新commit同步到此分支,可能要手動解決沖突(合並過程中,異常退出vi窗口,
用git rebase --edit-todo恢復,修改完,git rebase --continue 繼續下一步,
忽略,git rebase --skip,終止,用git rebase —abort)
5. 切回master,git merge feature 將feature分支內容合並到master
6. git push提交master
如此,master的提交歷史將是一條直線。
3. 分支的多個連續commit復制到其他分支
git rebase [startpoint] [endpoint] --onto [branchName] //將多個連續commit添加到目標分支branchName, [startpoint] [endpoint]指定的是一個 前開后閉的區間
例如:
git rebase 90bc0045b^ 5de0da9f2 --onto master //90bc0045b^后退一個commit,做成一個[90bc0045b, 5de0da9f2]閉區間
rebase完后,此時HEAD處於游離狀態,需要切換回目標分支,然后reset HEAD的位置
git checkout master
git reset --hard commitId //將分支的HEAD指向提交的id,切換回目標分支,會有提示,commitId使用提示中的最新id即可
4. commit合並
git rebase -i [startpoint] [endpoint] //[endpoint]可省略,將多個commit合並為一個,使用squash模式
例如:
git rebase -i HEAD~3 //往前3個commit,到現在,進行合並
5. commit拆分
git rebase -i 對指定commit的pick改為edit,進行編輯拆分
6. commit排序
git rebase -i 修改列表中commit順序即可
7. 改變分支起點
git checkout feature2
git rebase master
可以將feature2起點從別的分支改到master分支上
注意點:
主分支上不能rebase,如果如此,主分支的歷史將被篡改,不能看到原始的歷史記錄了
git pull時可以加上--rebase參數, 使之不產生Merge點, 保證了代碼的整潔,每次加rebase參數有點麻煩,
給指定分支設置為rebase方式,可以使用如下方式:
$ git config branch.dev.rebase true
使用時將 "dev" 修改成您自己本地的分支名字,必須cd到工程目錄下,才能更改分支配置
所有的分支都應該用rebase
$ git config --global branch.autosetuprebase always
這樣新建的分支會設置為rebase,已經建好的還需單獨設置