## 開發完成推向遠端分支 - 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. 檢查和測試 在完成上述步驟後,建議進行仔細的檢查和測試以確保一切都按預期工作。 ### 注意事項 - 這個過程可能會對團隊的工作流程造成中斷,尤其是在大型團隊或複雜項目中。 - 進行強制推送和歷史改變是一個重大的決定,應該在團隊內部有充分的溝通和一致的認識。 - 避免在公共或多人協作的分支上進行這樣的操作,除非絕對必要。