Sync "Rebasing and Merging" with en for zh-TW

This commit is contained in:
lumynou5 2023-06-22 16:14:57 +08:00
parent 45fe7228fb
commit 5226b2985e
No known key found for this signature in database
1 changed files with 59 additions and 21 deletions

View File

@ -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