将本地Git存储库与远程存储库同步

时间:2011-06-16 14:10:06

标签: git

我希望将本地存储库与远程存储库同步,以便我的本地存储库成为远程存储库的100%副本 - 这意味着如果这些存储库中的某些文件不同,我们会使用远程存储库覆盖本地存储库,并且如果本地存储库中存在远程不存在的文件,则会删除本地文件。

除了通过对远程存储库进行全新克隆之外,还有什么方法可以实现这一目标吗?

Sync local git repo with remote in one shot discarding local changes/commits类似的问题。

10 个答案:

答案 0 :(得分:265)

git fetch --prune
  

-p, - prune
     获取后,删除远程不再存在的任何远程跟踪分支。 prune options

答案 1 :(得分:115)

这些步骤可以做到:

git reset --hard HEAD
git clean -f -x -d -n

然后没有-n

这将处理所有本地更改。现在提交......

git status

并注意以下行:

Your branch is ahead of 'xxxx' by N commits.

记下数字'N' 现在:

git reset --hard HEAD~N
git pull

最后:

git status

应该显示无需添加/提交。 一切都干净。

然而,一个新的克隆可以做同样的事情(但速度很慢)。

===更新===

由于我的git知识在一段时间内略有改善,我提出了另一种更简单的方法来做同样的事情。这是如何(#with解释)。在你的工作分支中:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

虽然此后您的本地提交和更改将从视线中消失,但如有必要,可以恢复已提交的更改。

答案 2 :(得分:88)

您需要了解Git存储库不仅仅是一个目录和文件树,还存储了这些树的历史记录 - 可能包含分支和合并。

从存储库中获取时,您将全部或部分分支复制到存储库。然后将它们作为“远程跟踪分支”存储在您的存储库中,例如名为remotes/origin/master或类似名称的分支。

从远程存储库中获取新提交不会改变有关本地工作副本的任何内容。

您的工作副本通常会签出提交,名为HEAD。此提交通常是您当地某个分支机构的提示。

我想你想将你的本地分支(或者所有本地分支?)更新到相应的远程分支,然后查看最新的分支。

为避免与工作副本(可能有本地更改)发生冲突,首先要清除未版本化的所有内容(使用git clean)。然后检查与要更新的远程分支对应的本地分支,并使用git reset将其切换到获取的远程分支。 (git pull将在本地更新远程分支的所有更新(可能会执行相同操作),或者如果您有本地提交,则创建合并提交。)

(但是你会真正失去任何本地更改 - 无论是在工作副本还是本地提交中。确保你真的想要这个 - 否则最好使用新的分支,这会保存你的本地提交。并使用git stash保存尚未提交的更改。)


修改 如果您只有一个本地分支并且正在跟踪一个远程分支,那么您需要做的就是

git pull

来自工作目录。

这将获取所有被跟踪远程分支的当前版本,并将当前分支(和工作目录)更新为它正在跟踪的远程分支的当前版本。

答案 3 :(得分:62)

你想做

git fetch origin
git reset --hard origin/master
git clean -f -d

这使您的本地仓库与远程仓库完全一样。

请记住使用要与其同步的远程和分支替换origin和master。

答案 4 :(得分:4)

(此信息来自The Git User's Manual

我也在学习,所以这可能不是问题的答案,但它可能对某些人有所帮助:

  1. 最初克隆远程存储库时,所有分支的副本都存储在本地存储库中(使用git branch -r查看)
  2. 要更新这些副本并使其成为当前副本(即与远程分支同步)请使用git fetch。这不会影响您现有的任何自定义分支。
  3. 要覆盖您的本地分支机构结帐,您正在处理的任何分支机构的新版本(假设您已经执行git add origin /path/to/repository)使用git checkout origin/branch_name,这将覆盖您在分支{{1}上的本地更改}}

答案 5 :(得分:3)

听起来你想要一个远程存储库的镜像:

git clone --mirror url://to/remote.git local.git

该命令创建一个裸存储库。如果你不想要一个裸存储库,事情会变得更复杂。

答案 6 :(得分:3)

如果您正在谈论同步分叉回购,那么您可以按照以下步骤操作。

如何从git

同步fork存储库
  1. 检查您当前的git分支

    git branch

  2. 如果您不在主人身上,则结帐到主人

    git checkout master

  3. 如果您具有正确的访问权限,则获取上游存储库

    git fetch upstream

  4. 如果您收到以下错误,请运行

    git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. 现在运行以下命令。

    git fetch upstream

  6. 现在,如果你在master上,那么将upstream / master合并到master分支

    git merge upstream/master

    就是这样!!

    通过git remote命令进行交叉检查,更具体的git remote -v

    如果我也拥有上游仓库的提交权限,我可以创建一个本地上游分支,并在那里上游工作。

答案 7 :(得分:2)

重置本地存储库并将其与远程分支同步

命令: 记住要用要与之同步的远程和分支替换origin和master。

git fetch origin && git reset --hard origin/master && git clean -f -d

或分步进行:

git fetch origin
git reset --hard origin/master
git clean -f -d

您的本地分支现在是远程分支的精确副本(包括所有内容)。

命令输出:

这里是在JBoss Forge git存储库的本地克隆上运行命令的示例。

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$

答案 8 :(得分:0)

如果要在遥控器上创建新分支以镜像和跟踪您的本地分支(反之亦然)的永久性解决方法是:

git config --global push.default current

在执行git clone之后,我总是使用此命令配置本地git。尽管可以在本地远程分支“ Git致命:当前分支没有上游分支”错误时随时应用它。

希望这会有所帮助。太和平了。 :)

答案 9 :(得分:-2)

您可以使用git hooks。只需创建一个钩子,在更新后将其更改为另一个仓库。

当然,您可能会遇到合并冲突,因此您必须考虑如何处理它们。