2012-09-25 52 views
4

假設我有一個任意的本地git工作目錄,從某個遠程克隆。我希望使本地git存儲庫與遠程系統完全相同,無論本地目錄被克隆後發生了什麼。我不想做另一個完整的克隆。以任意的git工作副本,並使遠程分支完全相同

說本地工作目錄有:

  • 額外未跟蹤文件
  • 刪除的文件
  • 上演的變化。
  • 可能在某個任意分支上。
  • 有一大堆提交的,因爲從遠程

被克隆現在,我想使這個本地倉庫反映遠程準確。這是我目前的解決辦法,但我不知道這是否涵蓋所有情況,以及是否有一個簡單的解決方案:

git stash 
git clean -f -x -d 
git checkout master 
git fetch origin 
git reset --hard origin/master 
git pull origin master 

有沒有更好的方式來做到這一點?

+1

最後'git的pull'的'fetch' +'reset'後肯定是多餘的。 –

+0

您的本地存儲庫有一個工作副本,而您的遠程是一個裸存儲庫。本質上,它們在這個基本的方式上是不同的,並且沒有辦法使「完全」相同。你可以精確地複製對象和引用。 –

回答

3
git reset --hard 

會轉儲您包含您已經分階段進行的任何更改。

git clean -xdf 

將擺脫你的工作目錄中的任何東西,因爲忽略或排除git沒有跟蹤。

git checkout HEAD 

將把你放在沒有分支,所以你可以清理一切。

git branch | xargs git branch -D 

將刪除所有地方分公司

git tag -l | xargs git tag -d 

將刪除所有標籤

git prune origin 

將擺脫任何追蹤分支機構不再對遠程

git fetch 

會得到任何br您沒有的遠程設備和標籤。你可以停在這裏結帳你想

git checkout origin/master 

上下工夫,同時創建一個本地分支任何遠程分支機構或您可以創建本地分支指向所有現有的遠程分支指向作爲您與

git branch -r | xargs -n 1 git checkout 
+0

因此,如果你在完成所有這些後做了一個git push origin master,那麼在所有情況下都會有0個變化? – aloo

+0

是的。如果你做了這些事情中的每一件,你就不會有任何推動。 –

+0

要考慮的一件事是,如果你在Windows上工作,你的行尾可能會被註冊爲更改。添加它們並提交會給你一些最終被推送的東西。 –

2

下面的命令集應該讓你與遠程分支相同的狀態:

git checkout -f master    # Check out the local 'master' branch 
git fetch origin      # Fetch the 'origin' remote 
git reset --hard origin/master  # Reset all tracked files to remote state 
git clean -dxff      # Remove all non-tracked files 

注意,(原因很明顯),這些命令是具有潛在破壞性的 - 也就是說,任何局部變化被這個覆蓋並且沒有保存在可以通過其他方式訪問的提交中將會丟失。