diff --git a/README_zh-TW.md b/README_zh-TW.md index b637f1a..26c413d 100644 --- a/README_zh-TW.md +++ b/README_zh-TW.md @@ -86,15 +86,17 @@ - [我想將分支一分為二](#%E6%88%91%E6%83%B3%E5%B0%87%E5%88%86%E6%94%AF%E4%B8%80%E5%88%86%E7%82%BA%E4%BA%8C) - [重定基底與合併](#%E9%87%8D%E5%AE%9A%E5%9F%BA%E5%BA%95%E8%88%87%E5%90%88%E4%BD%B5) - [撤銷重定基底或合併](#%E6%92%A4%E9%8A%B7%E9%87%8D%E5%AE%9A%E5%9F%BA%E5%BA%95%E6%88%96%E5%90%88%E4%BD%B5) - - [我做了重定基底,但是我不想強制推送](#%E6%88%91%E5%81%9A%E4%BA%86%E9%87%8D%E5%AE%9A%E5%9F%BA%E5%BA%95%E4%BD%86%E6%98%AF%E6%88%91%E4%B8%8D%E6%83%B3%E5%BC%B7%E5%88%B6%E6%8E%A8%E9%80%81) + - [我重定了基底,但我不想強制推送](#%E6%88%91%E9%87%8D%E5%AE%9A%E4%BA%86%E5%9F%BA%E5%BA%95%E4%BD%86%E6%88%91%E4%B8%8D%E6%83%B3%E5%BC%B7%E5%88%B6%E6%8E%A8%E9%80%81) - [我需要組合幾個提交](#%E6%88%91%E9%9C%80%E8%A6%81%E7%B5%84%E5%90%88%E5%B9%BE%E5%80%8B%E6%8F%90%E4%BA%A4) - [安全合併的策略](#%E5%AE%89%E5%85%A8%E5%90%88%E4%BD%B5%E7%9A%84%E7%AD%96%E7%95%A5) - - [我需要將一個分支合併成一個提交](#%E6%88%91%E9%9C%80%E8%A6%81%E5%B0%87%E4%B8%80%E5%80%8B%E5%88%86%E6%94%AF%E5%90%88%E4%BD%B5%E6%88%90%E4%B8%80%E5%80%8B%E6%8F%90%E4%BA%A4) + - [我需要將整個分支合併成單一提交](#%E6%88%91%E9%9C%80%E8%A6%81%E5%B0%87%E6%95%B4%E5%80%8B%E5%88%86%E6%94%AF%E5%90%88%E4%BD%B5%E6%88%90%E5%96%AE%E4%B8%80%E6%8F%90%E4%BA%A4) - [我只想組合未推送的提交](#%E6%88%91%E5%8F%AA%E6%83%B3%E7%B5%84%E5%90%88%E6%9C%AA%E6%8E%A8%E9%80%81%E7%9A%84%E6%8F%90%E4%BA%A4) + - [我需要中止合併](#%E6%88%91%E9%9C%80%E8%A6%81%E4%B8%AD%E6%AD%A2%E5%90%88%E4%BD%B5) + - [我需要更新分支的親代提交](#%E6%88%91%E9%9C%80%E8%A6%81%E6%9B%B4%E6%96%B0%E5%88%86%E6%94%AF%E7%9A%84%E8%A6%AA%E4%BB%A3%E6%8F%90%E4%BA%A4) - [檢查分支上的所有提交是否都合併了](#%E6%AA%A2%E6%9F%A5%E5%88%86%E6%94%AF%E4%B8%8A%E7%9A%84%E6%89%80%E6%9C%89%E6%8F%90%E4%BA%A4%E6%98%AF%E5%90%A6%E9%83%BD%E5%90%88%E4%BD%B5%E4%BA%86) - [互動式重定基底可能出現的問題](#%E4%BA%92%E5%8B%95%E5%BC%8F%E9%87%8D%E5%AE%9A%E5%9F%BA%E5%BA%95%E5%8F%AF%E8%83%BD%E5%87%BA%E7%8F%BE%E7%9A%84%E5%95%8F%E9%A1%8C) - [編輯介面出現「noop」](#%E7%B7%A8%E8%BC%AF%E4%BB%8B%E9%9D%A2%E5%87%BA%E7%8F%BEnoop) - - [有衝突的情況](#%E6%9C%89%E8%A1%9D%E7%AA%81%E7%9A%84%E6%83%85%E6%B3%81) + - [衝突](#%E8%A1%9D%E7%AA%81) - [貯存](#%E8%B2%AF%E5%AD%98) - [貯存所有更動](#%E8%B2%AF%E5%AD%98%E6%89%80%E6%9C%89%E6%9B%B4%E5%8B%95) - [貯存指定檔案](#%E8%B2%AF%E5%AD%98%E6%8C%87%E5%AE%9A%E6%AA%94%E6%A1%88) @@ -1144,9 +1146,9 @@ origin/HEAD set to main (my-branch)$ git reset --hard ORIG_HEAD ``` -### 我做了重定基底,但是我不想強制推送 +### 我重定了基底,但我不想強制推送 -不幸的是,如果你想把重定基底的結果反映在遠端分支上,你必須強制推送。因為你改變了歷史記錄,遠端不會接受使用快轉,而必須強制推送。這就是許多人使用合併工作流程、而不是重定基底工作流程的主要原因之一,開發者的強制推送會使大團隊陷入麻煩。 +不幸的是,如果你想把重定基底的結果反映在遠端分支上,你必須強制推送。因為歷史記錄變更了,遠端不會接受使用快轉,而必須強制推送。這就是許多人使用合併工作流程、而不是重定基底工作流程的主要原因之一,強制推送會使大團隊陷入麻煩。 一種安全的方式是,不要推送到遠端: @@ -1157,26 +1159,24 @@ origin/HEAD set to main (main)$ git merge --ff-only my-branch ``` -參見[此 StackOverflow 討論串](http://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push)。 +參見[此 Stack Overflow 討論串](http://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push)。 ### 我需要組合幾個提交 -假設你的工作分支將對 `main` 分支做拉取請求。 - -最簡單的情況下,不會關心提交的時間戳,只想將所有的提交組合成一個單獨的提交,你可以重設和重新提交。確保 `main` 是最新的,且你的更動都已經提交,然後: +假設你在(將)對 `main` 分支拉取請求的分支上工作。最簡單的例子中,你只是想將所有的提交組合成一個單獨的提交,且你不關心提交的時間戳,你可以重設和重新提交。確保 `main` 是最新的,且你的更動都提交了,然後: ```sh (my-branch)$ git reset --soft main (my-branch)$ git commit -am "New awesome feature" ``` -如果你想保留更多控制、保留時間戳,你需要互動式重定基底: +如果你想更精細地控制、保留時間戳,你需要互動式重定基底: ```sh (my-branch)$ git rebase -i main ``` -如果沒有相對於其他分支,將不得不相對於 `HEAD` 重定基底。例如,要組合最近的兩次提交,需相對於 `HEAD~2` 重定基底,組合最近三次提交,則相對於 `HEAD~3`,以此類推。 +如果沒有相對於另一個分支,你將不得不相對於 `HEAD` 重定基底。例如,要壓縮最近的兩次提交,需對 `HEAD~2` 重定基底;組合最近三次提交,則是對 `HEAD~3`;以此類推。 ```sh (main)$ git rebase -i HEAD~2 @@ -1209,9 +1209,11 @@ pick e3851e8 another fix # Note that empty commits are commented out ``` -(以 `#` 開頭的行是註解,不影響重定基底。) +以 `#` 開頭的行是註解,不影響重定基底。 -你可以以註解中提到的命令替換 `pick`,也可以刪除一行來刪除對應的提交。例如,如果要保留最舊(first)的提交,並將其他組合成第二個提交,應該將第二個提交之後所有提交的命令改為 `f`: +你可以用註解中列出的命令替換 `pick`,也可以刪除一行來刪除對應的提交。 + +例如,如果要**保留最舊(第一個)的提交,並將其餘的組合成第二個提交**,應該將第二個提交之後所有提交的命令改為 `f`: ```vim pick a9c8a1d Some refactoring @@ -1220,7 +1222,7 @@ f b729ad5 fixup f e3851e8 another fix ``` -如果要組合並重新命名這個提交,應該在第二個提交加上 `r`,或使用 `s` 取代 `f`: +如果要組合**並重新命名這個提交**,應該在第二個提交加上 `r`,或使用 `s` 取代 `f`: ```vim pick a9c8a1d Some refactoring @@ -1229,7 +1231,7 @@ s b729ad5 fixup s e3851e8 another fix ``` -你可以在接著彈出的文字提示中重新命名那個提交: +你可以在接著彈出的編輯器中重新命名那個提交: ```vim Newer, awesomer features @@ -1247,7 +1249,7 @@ Newer, awesomer features 應該會看到如下的成功訊息: ```sh -(main)$ Successfully rebased and updated refs/heads/main. +Successfully rebased and updated refs/heads/main. ``` #### 安全合併的策略 @@ -1258,7 +1260,7 @@ Newer, awesomer features (main)$ git merge --no-ff --no-commit my-branch ``` -#### 我需要將一個分支合併成一個提交 +#### 我需要將整個分支合併成單一提交 ```sh (main)$ git merge --squash my-branch @@ -1266,17 +1268,42 @@ Newer, awesomer features #### 我只想組合未推送的提交 -假設在推送到上游前,你有幾個正在進行的工作提交,這時候不希望把已推送的提交也組合進來,因為其他人可能已經有提交引用它們了。 +假設在推送到上游前,你有幾個在製的提交,這時候不希望把已推送的提交也組合進來,因為其他人可能已經有提交引用它們了。 ```sh (main)$ git rebase -i @{u} ``` -這會進行一次互動式重定基底,只會列出還沒推送的提交。對這些提交重新排序或做 squash、fixup 都是安全的。 +這會進行一次互動式重定基底,只會列出還沒推送的提交。對這些提交重新排序或做 `squash`、`fixup` 都是安全的。 + +#### 我需要中止合併 + +有時合併會導致某些檔案有問題,這種情況下可以用 `--abort` 選項中止衝突解決,嘗試回復到先前的狀態。 + +```sh +$ git merge --abort +``` + +此命令在 Git 1.7.4 及以後可用。 + +### 我需要更新分支的親代提交 + +假設有分支: + * `main` + * `feature-1`,從 `main` 分支出來 + * `feature-2`,從 `feature-1` 延伸出來 + +如果在 `feature-1` 上提交,`feature-2` 的親代提交便不對了(因為是其的延伸,應該要在 `feature-1` 的頂端)。可以用 `git rebase --onto` 來修正這個問題。 + +```sh +(feature-2)$ git rebase --onto feature-1 [feature-2 上第一個不想帶來的提交] feature-2 +``` + +如果你正在一個尚未合併的功能上編寫新的功能,而前者的漏洞修復需要反映到後者的分支,這會很有用。 ### 檢查分支上的所有提交是否都合併了 -要檢查一個分支上的所有提交是否都已經合併進了其它分支,應該在這些分支的 `HEAD`(或任何提交)之間檢查差異: +要檢查一個分支上的所有提交是否都已經合併進了另一個分支,應該在這些分支的 `HEAD`(或任何提交)之間檢查差異: ```sh (main)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll @@ -1304,7 +1331,7 @@ noop * 確保 `main` 分支沒有問題 * 對 `HEAD~2` 或更早的提交重定基底 -#### 有衝突的情況 +#### 衝突 如果不能成功的完成重定基底,你可能必須要解決衝突。 @@ -1332,6 +1359,17 @@ Changes not staged for commit: 你必須解決新提交的內容和 `HEAD` 中的內容的衝突。 +如果你想要保留其中一個分支的版本,你可以用 `--ours` 和 `--theirs`: + +```sh +$ git checkout --ours README.md +``` + +* *合併*時,`--ours` 代表保留本機分支的更動,`--theirs` 則是另一個分支的更動。 +* *重定基底*時,`--theirs` 代表保留本機分支的更動,`--ours` 則是另一個分支的更動。 + +關於為什麼互換了,參見 [Git 文件的此註記](https://git-scm.com/docs/git-rebase#git-rebase---merge)。 + 有時候衝突非常複雜,你可以使用可視化差異編輯器: ```sh