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

Axl*_*Axl 261 git

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

有没有办法实现除了远程存储库的新克隆之外的其他方法?

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

job*_*wat 295

git fetch --prune
Run Code Online (Sandbox Code Playgroud)

-p, - prune
获取后,删除远程不再存在的任何远程跟踪分支.修剪选项

  • 这就是我在寻找的东西!PS下次在挖掘stackoverflow之前我会仔细阅读man page :-) (6认同)
  • 是的,'git pull -p`做同样的事情 - 'git pull使用给定的参数运行git fetch并调用git merge将检索到的分支头合并到当前分支中' - http://git-scm.com/docs/混帐拉 (5认同)
  • @SergiySokolenko 这就是我们所说的,但在内心深处我们知道 SO 已经变得比手册页更方便:-P (4认同)
  • 在这种情况下,`git pull`是否有效? (2认同)
  • 使用`git fetch <remote> --prune`,万一有人只需要`--prune`特定的遥控器.例如.`git fetch upstream --prune`. (2认同)

Fra*_*ace 127

这些步骤将执行此操作:

git reset --hard HEAD
git clean -f -x -d -n
Run Code Online (Sandbox Code Playgroud)

然后没有 -n

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

git status
Run Code Online (Sandbox Code Playgroud)

并注意如下行:

Your branch is ahead of 'xxxx' by N commits.
Run Code Online (Sandbox Code Playgroud)

现在记下数字'N':

git reset --hard HEAD~N
git pull
Run Code Online (Sandbox Code Playgroud)

最后:

git status
Run Code Online (Sandbox Code Playgroud)

应该没有显示任何添加/提交.一切都干净.

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

===更新===

由于我的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.
Run Code Online (Sandbox Code Playgroud)

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


Paŭ*_*ann 89

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

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

从远程存储库获取新提交不会改变有关本地工作副本的任何信息.

您的工作副本通常会签出一个提交,称为HEAD.此提交通常是您的一个本地分支的提示.

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

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

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


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

git pull
Run Code Online (Sandbox Code Playgroud)

从工作目录中.

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


aan*_*dis 77

你想做

git fetch --prune origin
git reset --hard origin/master
git clean -f -d
Run Code Online (Sandbox Code Playgroud)

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

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

  • 警告:它会删除未跟踪的文件 (5认同)
  • 它还从 npm install 和 bower install 中删除所有目录,除非您想重新安装 .gitignore 中的所有依赖项,否则不推荐 (2认同)
  • @ZahidKhan 我不知道到底发生了什么,但你所描述的应该是不可能的。上述所有命令只会影响您的本地存储库,而不会影响远程存储库。 (2认同)

Mah*_*tap 6

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

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

git fetch origin && git reset --hard origin/master && git clean -f -d
Run Code Online (Sandbox Code Playgroud)

或分步进行:

git fetch origin
git reset --hard origin/master
git clean -f -d
Run Code Online (Sandbox Code Playgroud)

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

命令输出:

这是在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$
Run Code Online (Sandbox Code Playgroud)


tjb*_*tjb 5

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

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

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


Mak*_*kis -3

您可以使用git hooks来实现这一点。只需创建一个钩子,在更新后将更改推送到其他存储库。

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