---
# System prepended metadata

title: '開發完成推向遠端分支 - git rebase、git pull --rebase '
tags: [git]

---

## 開發完成推向遠端分支 - git rebase、git pull --rebase 
### 工作前
1. `git checkout 分支名 ` : 切換到工作分支。
  <br>或使用 `git checkout -b 分支名 ` 建立並切換分支


### 交付
1. `git add . `
2. `git commit -m "描述"  `
3. `git pull --rebase origin dev ` : 將當前分支 rebase 到遠端 origin/dev 分支上。
如果衝突解失敗請用 `git rebase --abort ` 可回到 pull --rebase 之前。
4. `git push -u origin HEAD  ` : 將目前分支推向遠端庫中同名分支 ( --set-upstream = -u ) 

#### 舊方案參考
分解動作，更新地端分支
  ```bash
  $ git fetch
  $ git checkout dev
  $ git pull 
  $ git checkout my_branch
  $ git rebase dev 
  $ git push -u origin HEAD
  ```
#### 解 rebase 衝突
1. 開啟檔案修改
2. `git add . ` : 確認無誤，將更動加入緩存
3. `git rebase --continue` : 進行 commit message 確認
  \- 修改提交訊息 : 按下 `enter` 進入編輯，按下 `esc` 結束編輯。
  \- 儲存提交訊息 : 輸入 `:wq!` 確認提交
  \- 不要儲存離開 : 按下 `ctrl + c` 


## 選用
### Stash
1. `git stash push -u -m "message" `: 建立暫時版本，並命名 (包含尚未追蹤檔案: -u (--include-untracked))
2. `git stash apply stash@{0} ` : 還原指定的 stash 版本
3. `git stash list ` : 查看 Stash 清單 
4. `git stash show -p stash@{1} ` : 查看指定版本 diff


### 查看 Log
#### 歷史紀錄
1. `git log --all --decorate --oneline --graph ` : 圖形化顯示 Log
2. `git show 版號 ` : 顯示指定版號紀錄的變動 

#### 當前狀態
1. `git status -v ` : 查詢現在這個目錄的「狀態」 (含 staged file 的 diff 資料: -v)
2. `git diff ` : 查詢工作目錄與 staged 的 diff 
3. `git diff --staged ` : 查詢 staged 與 HEAD 的 diff

#### 清除不要的工作
1. `git reset` : 緩存回到指定 head 版本 ( = 取消add . ) 
2. `git reset --hard 版號 ` : 工作目錄與緩存都回到指定 HEAD 版本
3. `git clean -f -d ` : 強制清除未追蹤的檔案 (ex: 此次新增的檔案)


## 使用 `git rebase` 對已經推送（push）到遠端的分支進行操作 (by ChatGPT)
> User
> 使用 github 已經 git push 過分支， 想要 git rebase --force 到其他分支上，如何整理，應注意哪些事項 ？

使用 `git rebase` 對已經推送（push）到遠端的分支進行操作時，需要格外小心，因為這可能影響其他基於這個分支工作的團隊成員。特別是當您打算使用 `--force`（或 `--force-with-lease`）選項時，這會覆蓋遠端分支的歷史。

### 步驟

1. **確認當前分支**：首先，確保您當前處於要 rebase 的分支。

   ```bash
   git checkout your-branch
   ```

2. **執行 Rebase**：執行 rebase 命令將您的分支重新基於目標分支（例如 `main` 或 `master`）。

   ```bash
   git fetch origin
   git rebase origin/target-branch
   ```

3. **解決衝突**：如果在 rebase 過程中遇到衝突，Git 會暫停，讓您解決衝突。解決完所有衝突後，繼續 rebase。

   ```bash
   git add .
   git rebase --continue
   ```

4. **強制推送**：使用 `--force` 或更安全的 `--force-with-lease` 選項將您的分支強制推送到遠端。

   ```bash
   git push --force-with-lease origin your-branch
   ```

### 注意事項

1. **通知團隊成員**：在強制推送之前，務必通知所有可能受影響的團隊成員。這是因為強制推送會改變遠端分支的歷史，這可能會對基於該分支的其他工作造成問題。

2. **避免對公共/共享分支使用**：盡量避免對公共或多人共享的分支進行 rebase 和強制推送，因為這會導致其他人的本地歷史與遠端不同步。

3. **使用 `--force-with-lease`**：相比於 `--force`，`--force-with-lease` 是一個更安全的選擇，因為它會在遠端分支有你未知的更新時阻止推送。

4. **備份分支**：在進行有風險的操作之前，考慮先備份您的分支。

   ```bash
   git branch your-branch-backup
   ```

5. **清理歷史**：如果您的目的是清理提交歷史（例如合併多個小提交為一個大提交），確保您了解哪些提交將被合併，並確認不會丟失重要更改。

6. **測試更改**：在推送之前，在本地測試您的分支以確保所有東西都正常工作。

使用 `git rebase` 和強制推送是一個強大但危險的 Git 功能，應謹慎使用。确保您充分了解其後果，並在需要時尋求幫助或進行適當的團隊協調。

---
### 更新本地分支來匹配遠端的新歷史

如果您已經使用 `git rebase` 和 `--force` 選項強制推送（push）了某個分支到 GitHub，並且其他人已經基於尚未 rebase 的版本進行了工作，那麼他們需要更新他們的本地分支來匹配遠端的新歷史。以下是同步更新的步驟：

### 1. 通知團隊成員
在進行任何操作之前，首先確保通知所有受影響的團隊成員。這樣他們知道發生了歷史改變，並且可以採取適當的行動來更新他們的本地分支。

### 2. 備份當前工作
建議團隊成員在執行同步之前，備份當前分支的工作。這可以通過創建一個新的分支來完成：

```bash
git checkout -b backup-branch
```

### 3. 拉取遠端最新更改
然後，他們應該從遠端拉取最新的更改。由於分支歷史已經改變，直接拉取可能會導致衝突。因此，他們可以先重置他們的本地分支到遠端的狀態：

```bash
git fetch origin
git checkout affected-branch
git reset --hard origin/affected-branch
```

這將會使得他們的本地分支完全匹配遠端的新歷史。

### 4. 重新應用本地更改
如果他們有未推送的本地提交，可以使用 `git cherry-pick` 或創建補丁（patches）來將這些提交重新應用到更新後的分支上。

使用 `git cherry-pick` 的示例：

```bash
git cherry-pick commit-sha
```

其中 `commit-sha` 是他們想要重新應用的提交的 SHA 校驗和。

### 5. 解決衝突
如果在重新應用提交時出現衝突，他們需要手動解決這些衝突，然後繼續進程。

### 6. 檢查和測試
在完成上述步驟後，建議進行仔細的檢查和測試以確保一切都按預期工作。

### 注意事項

- 這個過程可能會對團隊的工作流程造成中斷，尤其是在大型團隊或複雜項目中。
- 進行強制推送和歷史改變是一個重大的決定，應該在團隊內部有充分的溝通和一致的認識。
- 避免在公共或多人協作的分支上進行這樣的操作，除非絕對必要。