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


297

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

除了进行远程存储库的全新克隆之外,还有其他方法可以实现吗?

类似的问题与一键式同步远程本地git repo丢弃本地更改/提交


4
每当我来这里时,我总是在寻找同步叉子
Martin Thoma,2016年

1
git fetch --prune
hassanzadeh.sd

Answers:


342
git fetch --prune

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


6
那就是我想要的!PS下次,我将在挖掘stackoverflow之前更仔细地阅读手册页:-)
Sergiy Sokolenko 2014年

5
是的,git pull -p是否相同-'git pull使用给定的参数运行git fetch并调用git merge将检索到的分支头合并到当前分支中'' -git-scm.com/docs/git-pull
jobwat 2014年

2
git fetch <remote> --prune,万一有人只需要--prune特定的远程。例如。git fetch upstream --prune
Fery Wardiyanto

git fetch origin --prune将您的本地存储库与upstream项目的分支同步
Stuart Cardall '18

2
@SergiySokolenko就是我们所有人所说的,但是从最深处我们知道SO变得更加方便了手册页:-P
Marcello Romani

144

这些步骤可以做到:

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知识随着时间的推移略有提高,我想出了另一种更简单的方法来做到这一点。这是方法(带有解释的#)。在您的工作分支中:

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.

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


1
感谢这么多的更新工作完全正常使用的github和到位桶:)
CommonSenseCode

对于我来说,此答案是最可靠的解决方案之一。
AlanH

95

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

从存储库中获取数据时,您会将其中的全部或部分分支复制到您的存储库中。然后,这些作为“远程跟踪分支”在您的存储库中,例如,名为like之类的分支remotes/origin/master

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

您的工作副本通常已签出一次提交,称为HEAD。此提交通常是您本地分支机构之一的提示。

我认为您想将本地分支(或所有本地分支?)更新为相应的远程分支,然后签出最新的分支。

为了避免与您的工作副本发生任何冲突(可能会有局部更改),您首先要清理所有未版本化的内容(使用git clean)。然后,签出与您要更新到的远程分支相对应的本地分支,并用于git reset将其切换到获取的远程分支。(git pull将远程分支的所有更新合并到您的本地分支中,此更新可能会执行相同的操作;如果您具有本地提交,则将创建合并提交。)

(但是那样的话,您实际上将丢失所有本地更改-在工作副本和本地提交中。请确保您确实想要这样做-否则最好使用新分支,这样可以保存本地提交。并用于git stash保存尚未提交的更改)


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

git pull

从工作目录内部。

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


如果我在本地存储库中更改了NOTHING,则仅a。)希望从远程获取所有内容的副本,b。)希望在版本之间显示差异。因此,我不承诺,不更改任何内容=没有本地更新/更改。我应该定期(例如,每周左右)使用哪些命令来实现以上两个功能?请回答KISS(保持简单愚蠢)-我也是git noob,ofc会进行RTFM-但首先需要帮助。;)
kobame 2011年

git pull我认为,在您的简单情况下a 应该就足够了。(我更新了答案。)
PaŭloEbermann 2011年

如果我有一些我不想提交的本地更改该怎么办。现在,当我拉动它时,它说我要提交或隐藏它们。因此,在这种情况下,我如何告诉git覆盖它们并进行拉取?
Harshana

89

你想做

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

这使您的本地存储库完全类似于远程存储库。

切记用要与之同步的远程和分支替换origin和master。


2
它还会从npm install和bower安装中删除所有目录,除非您要重新安装.gitignore中的所有依赖项,否则不建议这样做
chwagssd 2015年

它没有删除my node_modules,它完全可以按照我的要求工作。
Vahid Amiri

警告:它会删除未跟踪的文件
Amit Yadav

我使用此代码丢失了所有数据,尝试将本地存储库与git存储库同步。但这使我的全局存储库与本地存储库同步。
Zahid Khan

10

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

命令:请记住用要与之同步的远程和分支替换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

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

命令输出:

这是在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$

4

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

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

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

3

听起来像您想要远程存储库的镜像:

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

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


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上,则将上游/ master合并到master分支中

    git merge upstream/master

    而已!!

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

    如果我也对上游存储库具有提交权限,那么我可以创建一个本地上游分支,并进行将要在那里上游的工作。


当我在第三步中遇到错误时,为什么我应该在上游进行5.git提取?
Md Sifatul Islam伊斯兰教徒

-2

您可以为此使用git hooks。只需创建一个钩子即可在更新后将更改推送到另一个存储库。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.