2015-10-23 73 views
0

我是Git的新手,並且有一個問題。這兩個命令似乎是一個common pairing在Git命令中使用原點

git fetch --all 
git reset --hard origin/master 

如果我的目標是到本地克隆恢復到一個乾淨的狀態,這是怎麼比任一下列的不同?

git fetch --all 
git reset --hard master 
# no origin 

或者

git reset --hard origin/master 
# no fetch 

好像取第一,如果我們打算無論如何指定遠程直接是沒有必要的。我誤解了什麼嗎?這是一個有目的的傳統或僅僅是沒有基礎的傳統/習慣?

爲什麼我問:

我正在編寫構建機的腳本。我想在某個時間點獲取所有內容,然後在構建期間從本地內容中獲取工作量,以便在構建過程中不會發生變更。看起來好像我想從遠程獲取一次,並且在那之後的命令中沒有指定origin。但是,我很難在網上找到這樣的例子,所以我不確定是否有一些我錯過了。

+0

爲了將來的參考,'origin/master'和'master'都是**本地**分支,它們是不同的。提取實際上需要更新本地'origin/master'分支。 – Zach

回答

2

首先是遠程分支的基礎知識。您的存儲庫看起來像這樣。

A - B - C [origin/master] 
     \ 
      D - E [master] 

masterorigin/master有兩個分支,它只是標籤點在提交。在這種情況下,自上次提取以來,您已經提交了兩次提交至master的提交。

Git不告訴網絡,除非你告訴它。它跟蹤上一次查看遠程存儲庫時使用「遠程分支」。 origin/master是一個「遠程分支」。它是遠程名爲originmaster分支的本地副本,上次更新的時間爲git fetch origingit fetch --all(或git pull,它執行提取)。


git reset --hard origin/master 

這是用來扔掉所有本地工作。這會將當前分支和工作目錄重置爲origin/master,即CDE將會丟失。

A - B - C [origin/master] 
     \ 
      D - E [master] 

git reset --hard origin/master 

A - B - C [origin/master] 
      [master] 

git reset --hard master 

這將重置當前分支和工作目錄回到master如果您碰巧在master這將撤消您未提交的工作。但是,如果你在不同的分支,你只是吹走你的分支

要拋出未提交的更改,更安全的做法是git reset --hard HEADHEAD是一個指向當前簽出的提交的指針。無論你在哪個部門,它都可以工作。我有它的別名clear


我想在一個時間點來獲取所有內容,然後從本地內容生成的時間工作,所以沒有改變的機會通過構建正在取得部分路。

Git不告訴網絡,除非你告訴它。有兩個命令將更新您的本地存儲庫,git fetchgit pull(它執行提取)。如果你不運行這些,你的origin/遠程分支不會改變。

如果您在構建開始時抓取並簽出,那麼您將會很好。如果您需要重置爲乾淨狀態,則可以運行git reset --hard HEAD。您可能還想運行git clean -dxf,這會拋出任何未跟蹤或忽略的文件,如構建工件。

+0

所以我誤會了使用'origin /',這句話爲我清除了它:''origin/master'是'遠程分支'。它是你的**本地**副本遠程」。我認爲這太遙遠了。謝謝! – Zach