git:与远程同步本地回购

我有本地和远程git仓库。 我想将本地存储库与远程存储库同步,以便本地存储库成为远程存储库的100%副本。 这意味着如果这些回购中的某些文件有所不同,我们会用远程文件覆盖本地文件。 如果本地回购站点中存在远程回购站点中不存在的文件,则会删除本地文件。

除了做一个远程回购的新鲜克隆,有没有办法实现这一点?

类似的问题同步本地git回购一次性远程抛弃本地更改/提交 。

git fetch --prune 

-p,–prune
提取后,删除远程不存在的远程跟踪分支。 修剪选项

你需要明白,一个Git仓库不仅仅是一个目录和文件的树,而且还存储这些树的历史 – 可能包含分支和合并。

从存储库中获取时,您将把全部或部分分支复制到您的存储库。 然后,这些信息会以“远程跟踪分支”的forms存储在您的存储库中,例如名称类似于remotes/origin/master等的分支。

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

您的工作副本通常会提交一个提交,称为HEAD 。 这个提交通常是您当地分支机构的提示。

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

为了避免与您的工作副本(可能会有本地更改)的任何冲突,您首先清理所有未版本化(使用git clean )。 然后你签出你想要更新的远程分支对应的本地分支,并使用git reset将它切换到获取的远程分支。 ( git pull会把远程分支的所有更新合并到你的本地,如果你有本地提交的话,可能会这样做,或者创build一个合并提交。)

(但是你真的会失去任何本地修改 – 无论是在工作拷贝还是在本地提交中,确保你真的想要这个 – 否则最好使用一个新的分支,这样可以节省你的本地提交。但承诺。)


编辑:如果你只有一个本地分支,并且正在跟踪一个远程分支,你所要做的就是

 git pull 

从工作目录中。

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

这些步骤将做到这一点:

 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. 

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

你想要做的

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

这使得您的本地回购完全像您的远程回购。

请记住用您想要同步的远程和分支replace原点和主控。

(这个信息来自Git用户手册 )

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

  1. 当一个远程仓库被初始克隆时,所有分支的拷贝都存储在你的本地仓库中(用git branch -r查看它们)
  2. 要更新这些副本并使其成为当前(即与远程分支同步),请使用git fetch 。 这不会影响您现有的任何自定义创build的分支。
  3. 要覆盖你的本地分支签出一个你正在工作的任何分支的新版本(假设你已经执行了git add origin /path/to/repository ),使用git checkout origin/branch_name ,这将覆盖分支branch_name上的本地更改

听起来就像你想要一个远程仓库的镜像:

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

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

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

如何从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. 现在,如果你是主人,然后将上游/主人合并到主分支

    git merge upstream/master

    而已!!

    通过git remote命令crosscheck,更具体的git remote -v

    如果我也有对上游回购的承诺权,我可以创build一个当地的上游分支,做那些上游的工作。

你可以使用git钩子 。 只需创build一个更新后更改为其他回购的钩子。

当然,你可能会遇到合并冲突,所以你必须弄清楚如何处理它们。