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

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

除了重新克隆远程存储库之外,还有什么方法可以实现这一点吗?

同步本地git回购与远程在一个镜头丢弃本地更改/提交类似的问题。

646423 次浏览

你可以使用git钩子。只需创建一个钩子,在更新后将更改推到另一个回购。

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

您需要了解Git存储库不仅仅是目录和文件的树,而且还存储这些树的历史—其中可能包含分支和合并。

当从存储库中获取时,您将把所有或部分分支复制到存储库中。然后这些分支在你的存储库中作为“远程跟踪分支”,例如命名为remotes/origin/master或类似的分支。

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

你的工作副本通常有一个提交检出,称为HEAD。这个提交通常是某个本地分支的提示。

我认为您希望将您的本地分支(或者可能是所有本地分支?)更新到相应的远程分支,然后签出最新的分支。

为了避免与工作副本发生冲突(可能有局部更改),首先清理所有未版本化的内容(使用git clean)。然后签出与要更新到的远程分支对应的本地分支,并使用git reset将其切换到获取的远程分支。(git pull将把远程分支的所有更新合并到本地分支中,本地分支也可能做同样的事情,或者如果你有本地提交,则创建合并提交。)

(但是这样你就会丢失所有的本地更改——包括工作副本和本地提交。确保你真的想要这个-否则最好使用一个新的分支,这将保存你的本地提交。并使用git stash保存尚未提交的更改。)


<强>编辑: 如果您只有一个本地分支,并且正在跟踪一个远程分支,那么您所需要做的就是

git pull

从工作目录内部。

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

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

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

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

(此信息来自Git用户手册)

我也在学习,所以这可能不是问题的确切答案,但它可能会帮助一些人:

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

以下步骤可以做到:

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

然后没有-n

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

git status

注意下面这句话:

Your branch is ahead of 'xxxx' by N commits.
记下数字“N” 现在:< / p >
git reset --hard HEAD~N
git pull

最后:

git status

应该没有显示要添加/提交的内容。 所有清洁。< / p >

然而,一个新的克隆也可以做到这一点(但速度要慢得多)。

= = = = = =更新

随着时间的推移,我的git知识略有提高,我想出了另一种更简单的方法来做同样的事情。下面是如何做的(并加以解释)。在你的工作部门:

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 --prune
< p > -p, --prune < br > 获取后,删除远程上不再存在的任何远程跟踪分支。删除选项 < / p >

你想做的是

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

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

请记住用您想要同步的远程和分支来替换原点和主节点。

如果你正在谈论同步一个分叉回购,那么你可以按照这些步骤。

如何从git同步一个fork存储库

  1. 检查当前git分支

    git branch < / p >

  2. checkout到master如果你不在master上

    git checkout master < / p >

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

    git fetch upstream < / p >

  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. Now run the below command.

    git fetch upstream

  6. Now if you are on master then merge the upstream/master into master branch

    git merge upstream/master

    That's it!!

    Crosscheck via git remote command, more specific git remote -v

    If I also have commit rights to the upstream repo, I can create a local upstream branch and do work that will go upstream there.

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

< p >命令: 记住用你想要同步的远程和分支来替换原点和主节点
git fetch origin && git reset --hard origin/master && git clean -f -d

还是一步一步:

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

您的本地分支现在是远程分支的精确副本(提交和全部)。

命令输出:

下面是在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$

如果你想在远程上创建一个新的分支来镜像和跟踪你的本地分支(反之亦然),永久的修复方法是:

git config --global push.default current

在我克隆git之后,我总是用这个命令配置我的本地git。虽然它可以在本地-远程分支“Git致命:当前分支没有上游分支”的任何时候应用;发生错误。

这个脚本将检查哪些本地远程不存在于您的远程并将它们从本地删除

git fetch --prune; git branch -vv | egrep -v "(\[origin\/[a-zA-Z0-9/_-]+\])" | awk "{print \$1}" | xargs git branch -D