[英]Git pull from remote bare repository
當我嘗試pull
從一個光禿禿的遠程存儲庫,git的回報Already up-to-date
。
據我了解,如果本地倉庫有一些變化,我犯從而將它們推進HEAD
,不應該pull
取從裸遠程倉庫的不同文件(工作已被正確配置的樹),並與他們合並當地人覆蓋變化?
如果本地存儲庫已經更改並且提交了這些更改,那么推送當然是有效的 - 另一方面,拉動卻沒有。 如果遠程倉庫的變化和我pull
, fetch --all
或clone
的話,我要么得到同樣up-to-date
消息或舊的文件/以前壓的文件。
我究竟做錯了什么?
編輯 ,提供有關我想要做的更多信息。
我有一個包含兩個文件的本地存儲庫, foo.c
和foo.exe
,以及配置了post-receive掛鈎的裸遠程存儲庫,用於將所有推送的文件放入工作樹中。
發出git push remote master
,我可以在工作樹目錄中看到foo.c
和foo.exe
。 如果在本地存儲庫中修改了這兩個文件中的任何一個,則git add .
和git commit -m "commit"
將跟蹤修改后的文件,隨后的git push remote master
服務器將更新服務器上的文件。
如果在服務器上添加了foo.h
,無論如何,我嘗試git fetch remote master
,git說本地分支是最新的並且沒有合並(用本地替換獲取的提交文件,是嗎? ) 是必須的。 那怎么回事? 我是否需要首先在遠程存儲庫上提交更改?
基於編輯的問題更新
...來自裸露的遠程存儲庫(工作樹已正確配置)...
所以我理解這意味着您將repo初始化為--bare
然后添加了一個工作worktree
(更新配置以允許接收更新已簽出分支的推送),以便推送可以有效地部署您的可執行文件。
所以你原來說
如果遠程存儲庫發生更改並且我從中獲取 - 獲取 - 或從中進行克隆,則會獲得相同的最新消息或舊文件/先前推送的文件。
后來加了
如果在服務器上添加了foo.h,無論如何,我嘗試git fetch遠程master,git說本地分支是最新的並且沒有合並(用本地替換獲取的提交文件,是嗎? ) 是必須的。 那怎么回事? 我是否需要首先在遠程存儲庫上提交更改?
所以這里的問題是說“添加到遠程存儲庫”的意思。
每個回購(裸或其他)的工作方式相同。 您認為服務器存儲庫是一個遠程服務器,因為它在您的克隆中已經配置,但在服務器上,它只是一個本地存儲庫,恰好設置為以某種方式對推送作出反應。
所以你知道如果你把一個文件放在你的本地工作樹中,但你沒有添加並提交它,它就不會與其他的repos共享。 服務器上也是如此。 將foo.h放在服務器上只是意味着工作樹中有一個未跟蹤的文件。 (並且您要小心在服務器上進行無需更改的更改;它們可能會在將來的推送嘗試中造成混淆。)
push
和fetch
操作共享數據庫之間的refs和對象(提交及其依賴關系)。 這些操作並不關心“發送方”工作樹上的內容。 除了可能的安全措施以避免破壞文件之外,他們也不關心“接收方”工作樹上的內容。
簡而言之:是的,在服務器上你必須添加並提交文件,在分支上創建一個新的提交,然后在工作站上拉動任何東西。
我原來的答案部分沒有包含在上面繼續從這里繼續:
如果本地存儲庫有一些更改,並且我提交它們從而推進HEAD,則不應從裸存遠程存儲庫中提取不同的文件
更確切地說,
pull
執行fetch
和“合並”,並且您要求不應該從遠程fetch
文件以進行merge
。 答案是:只有自從你之前的fetch
/pull
它們已經改變了。 消息“已經是最新的”意味着遠程端沒有任何變化,超出了你已經fetch
,所以沒有什么新東西可以合並。 考慮:遙控器包含一些提交
A --- B --- C <--(master)
您
clone
了repo,或者fetch
到現有克隆,所以現在你有相同的; 然后你做一些工作並提交它
A --- B --- C <--(origin/master)
\
D <--(master)
現在你
pull
,這導致了一個fetch
。 但是fetch
並不直接下載文件 - 它會下載提交。 您已擁有源中的所有提交,因此無需下載; 這很好,因為文件的歷史(因為它們出現在原點)已經被考慮(從你首先fetch
edC
時開始)。
git fetch / push不對文件進行操作。 他們在提交時運作。 遠程有一堆提交(無論是否裸露都無關緊要)。 如果您在本地更改了某些文件並進行了提交,則本地存儲庫與遠程存儲庫之間存在差異。
在您的情況下,您已經在本地擁有遠程可用的所有提交,因此無需獲取任何內容。 這就是最新消息的原因。
如果在這種情況下運行git status
,您將獲得一個信息,即您在本地存儲庫中的某些更改未與遠程資源共享:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
當您按照建議發布更改時,兩個存儲庫(本地和遠程)將具有相同的提交(假設沒有其他人正在修改遠程存儲庫),因此,再次拉動不會獲取任何內容,這些更改已在本地可用。
但是,如果您在遠程存儲庫上有一些提交,但在本地提交時沒有提交,則情況會有所不同。
git fetch
將獲取這些提交,但它不會修改工作區中的文件。 要修改文件,您需要手動移動到新提交。 例如,通過運行git merge
命令 - 它將新獲取的更改合並到本地分支,並將活動提交更改為本地分支的一個提示。 值得注意的是, merge
僅合並當前分支上尚未提供的更改。 所以,如果你過去有一些提交並運行git merge old_commit_id
,那么什么都不會發生。
git pull
就像當前分支的git fetch
+ git merge
一樣。 因此,如果遠程提交,則會獲取它們。 然后,如果當前分支有來自遠程分支的更改,但尚未在當前分支上進行更改,則它們將被合並。
值得使用gitg
或gitk
工具來可視化提交和分支標簽的圖形,以更好地理解內部發生的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.