簡體   English   中英

為什么一個分支中的更改在另一個分支中可見?

[英]Why are changes in one branch visible in another branch?

我執行以下命令序列:

git init rep
cd rep/
echo '111' > 1.txt
git add 1.txt 
git commit -m '1'
git checkout -b dev
echo '222' > 1.txt 
git checkout master
more 1.txt 

由於這些命令,我​​看到

222

我不明白為什么。 如您所見,我創建並進入“開發”分支。 我在那里做了一些更改,但我不添加也不提交它們。 為什么從“dev”返回到“master”后,我確實看到了我在“dev”中所做的更改? 在我添加、提交並將它們合並回 master 之前,它們不應該留在 dev 中嗎?

當您在不同分支之間移動時,所有未跟蹤的文件都不會受到影響。 由於它們屬於您的文件系統,GIT 不知道這些文件屬於哪個分支。 所以當你提交這些文件時,GIT 知道哪些文件屬於哪個分支。 並且可以根據您的分支在工作區中刪除或添加文件。

這是因為您沒有將更改提交到分支 dev。 所以未提交的更改還沒有綁定到父提交。

git checkout dev
git add .
git commit -m "changed 1.txt"

如果要刪除更改,請執行

git reset --hard master

編輯

dev 和 master 分支指向相同的提交哈希。 查看文件夾 .git/refs/heads 內部,這是分支存儲在單獨文件中的地方。 內容是特定分支指向的提交哈希。 所以分支只是一個指向提交的指針。

在您結帳 master 或 dev 的特定情況下,它們都指向同一個提交,因此該操作不會更改工作樹。 否則你會得到一個錯誤。 現在嘗試在 dev 分支上更改一些東西,然后當git checkout master時你應該得到一個錯誤

正如其他人所指導的,要么提交您的更改,要么隱藏它們。 一種簡單的解決方案是在結帳前隱藏您的更改(即臨時保存)。 例子

git checkout -b dev
echo '222' > 1.txt 
git stash
git checkout master
# on return to dev, restore changes via following
git stash pop

現在您處於文檔的舊狀態。

git checkout -b dev
echo '222' > 1.txt 
git checkout master

您在上面1.txt行中對1.txt文件進行的更改不在任何分支上,因為它們沒有提交(它們甚至沒有添加到索引中)。

Git 分支只是一個指向提交的指針。 當您將分支從dev更改為master時,實際上並沒有更改當前檢出的提交。 這就是為什么 Git 不需要更新工作樹中1.txt的索引或內容的原因。

同樣的事情發生在我身上,但添加和提交文件沒有幫助。 然后我發現在使用checkout -b在本地創建分支后,我還必須遠程推送分支:

git push origin [name_of_your_new_branch]
  1. git checkout branch2 ,您在其中進行了修改。

  2. git add .

  3. git commit -m "message"

  4. git push -u origin branch2

檢查本地存儲庫,您將僅在branch2看到修改,而在 master 分支中看不到。 您的主分支將不受影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM