GitBash 切換到特定提交後修改並push到遠端(Checkout)
先查看Commit的哈希值
git log --oneline
選擇一個任意位於中間的commit
git checkout <commit-hash>
示例
進入分離的 HEAD 狀態並創建新提交:
git checkout abc1234
echo "Some changes" > file.txt
git add file.txt
git commit -m "Made some changes"
推送新提交到遠程倉庫並創建新分支:
git push origin HEAD:refs/heads/new-branch-name
這樣,遠程倉庫中會有一個名為 new-feature 的分支指向您新創建的提交。
總結
- GitHub 不接受孤立提交:提交必須屬於某個分支才能推送到遠程倉庫。
- 使用 git push origin HEAD:refs/heads/new-branch-name:確保在遠程倉庫創建一個新分支來接收分離的 HEAD 狀態下的新提交。
- 分離的 HEAD 狀態產生的commit會默認在本地,如果不push將可能會被當作垃圾回收
用文字來解釋在分離的 HEAD 狀態下創建新提交的過程。
初始狀態
1. 假設您有一個分支 master,其提交歷史如下:
A -- B -- C (master)
2. 當您使用 git checkout B 切換到特定提交 B 時,進入分離的 HEAD 狀態:
A -- B -- C (master)
\
HEAD
3. 假設您在分離的 HEAD 狀態下進行了修改並創建了一個新提交 D:
A -- B -- C (master)
\
D (HEAD)
4. 為了保留提交 D,您需要創建一個新分支 feature:
A -- B -- C (master)
\
D (feature, HEAD)
新分支 feature 指向提交 D,現在 HEAD 指針指向 feature 分支
假設到第3步放著不管會怎麼樣
假設您在分離的 HEAD 狀態下創建了一個新的提交 D,當前狀態如下:
A -- B -- C (master)
\
D (HEAD)
- 新提交 D 基於提交 B 創建。
- HEAD 指針指向新提交 D。
如果您在沒有創建新分支的情況下切換到另一個分支或特定提交,例如切換回 master 分支:
git checkout master
現在的狀態會變成:
A -- B -- C (master, HEAD)
\
D
- HEAD 指針現在指向 master 分支的最新提交 C。
- 新提交 D 仍然存在,但沒有任何分支引用它。此時,提交 D 成為一個孤立提交。
如果沒有其他分支或標籤引用新提交 D,並且 Git 進行了垃圾回收(Garbage Collection),孤立提交 D 可能會被刪除。
因此,為了確保新提交 D 不會丟失,您可以創建新的分支。
git checkout -b feature
現在的狀態會變成:
A -- B -- C (master)
\
D (feature, HEAD)
- feature 分支現在指向新提交 D。
- 新提交 D 被保護,不會丟失。
您還可以創建一個標籤引用提交 D,例如:
git tag new-feature
現在的狀態會變成:
A -- B -- C (master)
\
D (HEAD, new-feature)
- new-feature 標籤現在指向新提交 D。
- 新提交 D 被保護,不會丟失。
總結
為了避免丟失新提交,建議在分離的 HEAD 狀態下創建新提交後,立即創建一個新分支或標籤來引用這個提交。
→上一篇:GitBash關於回滾操作
→下一篇:GitBash關於Push操作
→返回目錄:GitBash使用手冊