EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

GitBash切換到特定提交後修改並push到遠端

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使用手冊

This article was last edited at 2024-07-11 09:26:17

* *