## 開發完成推向遠端分支 - 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. 檢查和測試 在完成上述步驟後,建議進行仔細的檢查和測試以確保一切都按預期工作。 ### 注意事項 - 這個過程可能會對團隊的工作流程造成中斷,尤其是在大型團隊或複雜項目中。 - 進行強制推送和歷史改變是一個重大的決定,應該在團隊內部有充分的溝通和一致的認識。 - 避免在公共或多人協作的分支上進行這樣的操作,除非絕對必要。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.