- Check Merge vs. Rebase
- use
git checkout
to change branch- Commit some changes
- stash the change which hasn't commited. (
git stash -u
) - push the commit up to
remote
- Pull request the branch
- Pop the stash out and continue doing development (
git stash pop
)
當要開始一個新功能開發時,可以創建feature branch,等待這個功能開發完成,確定應用到新版本終究合併回develop。
Rule:從develop創建,最後合併回develop
Branch name rule: feature/*;
很多地方會使用feature- or feature/
-
create branch from develop
$ git checkout -b feature/test develop
(從develop 拉一分支出來)$ git push origin feature/test
-
切換到develop 合併feature/test
$ git checkout develop
$ git merge --no-ff feature/test
(--no-ff
為創建一個新的commit用於合併的操作,可以避避免丟失該feature branch的歷史存在信息) -
移除本地和遠端的 feature/test
$ git branch -d feature/test
$ git push origin --delete feature/test
- 用來做新版本發布前的工作準備,可以在release branch 上做一些發布前的準備。同時,部會影響develop branch 上next version 的新功能開發
- Rule: 從 develop 分支創建,最終合併回 develop & master`
- Branch name rule: release-*
- 流程
-
create branch
$ git checkout -b release-1.1 develop
$ git push origin release-1.1
-
切換到 master 合併 release-1.1
$ git checkout master
$ git merge --no-ff release-1.1
$ git tag -a 1.1
$ git push origin 1.1
當預示著我們可以發布,打上對應版本號,再push 到remote -
切換到develop 合併release-1.1
$ git checkout develop
$ git merge --no-ff release-1.1
-
移除local & remote的release-1.1
$ git branch -d release-1.1
$ git push origin --delete release-1.1
-
Rule: 從master上當前版本號的tag切出,從最新的master上創建,最終合併回develop & master Branch name rule: hotfix-*
-
create fixbug branch
$ git checkout -b fixbug-1.1.1 master
$ git push origin fixbug-1.1.1
-
切換到master合併fixbug-1.1.1
$git checkout master
$ git merge --no-ff fixbug-1.1.1
$ git tag -a 1.1.1
$ git push origin 1.1.1
Bug 修完後,合併回master並打上版本號 -
切換到develop合併fixbug-1.1.1
$ git checkout develop
$ git merge --no-ff fixbug-1.1.1
-
移除local & remote fixbug-1.1.1
$ git branch -d fixbug-1.1.1
$ git push origin --delete fixbug-1.1.1
只是一種規範,讓整個團隊遵守某個工作流程的規範,比較不會發生問題。
- HEAD: 一個指標,告訴我們現在在整個 git history 的哪個位置、哪個分支。HEAD 會指向當前分支最新的那個commit,但也可以讓HEAD 指向任何一個commit,這種情況我們稱為 detached HEAD
# 查看現在指向哪個位置
cat .git/HEAD
# Output ref: refs/heads/feat/add_git_knowledge
- 切換分支
- 切換位置 指向指定 commit id: **detached HEAD** 有點像是暫時的 branch,離開時就會被刪除
# 切換分支
git checkout master
git checkout feature
# 切換到 commit id 的分支 (detached branch)
git checkout be235gf
reset
: 一樣可以回到之前的版本,但不像checkout
會開一個暫時的detached HEAD,他會實際把當下的branch 退回到你回到的地方 (移動 HEAD)。- Use Case: 做了一些程式改動,但因某些原因不想要了,但已經提交了幾個commit,這時就可以使用
reset
回到 commit 之前的版本
# ~n 表示回到 HEAD 的 前 n 版本
git reset HEAD~1
git reset HEAD~2
# HEAD^ 表示 HEAD的前一個版本
git reset HEAD^
# 可以直接使用 commit id
git reset be235gf
- 用了
reset
會察覺code 沒有改變,這是因為 git default 會做git reset --mixed xxx
。雖然commit回到過去的版本,但版本之後的這些改動並不會消失,而是回到working directory。是一種保護機制。 - 若要真正回到過去某個 commit id,可以用
git reset --hard xxx
。hard
部會把程式改動回 working directory
- 跟
checkout & reset
又有些不同,他回復版本的方式並不是移動HEAD
,他會幫忙複製新的 commit,這個commit 會把我們要revert
的 commit 的內容給逆向操作一遍。
git revert HEAD
git revert be235gf
- Use Case: 通常個人project 有
reset
讓 commit history 看起來比較乾淨。revert
比較是使用在跟他人合作時,會共用repository,一但你的commit 推到remote
再用reset
會改變本來branch history,會不太建議影響到其他人,所以此時用revert
較為合適。 - 在團隊當中可能有人程式改動造成嚴重bug 且沒辦法立刻找出原因的話,就會把有問題的commit 給
revert
達到 rollback 的效果。
Reference: Merge vs. Rebase