【问题标题】:Synchronizing a local Git repository with a remote one将本地 Git 存储库与远程存储库同步
【发布时间】:2011-09-16 10:15:21
【问题描述】:

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

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

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

【问题讨论】:

  • 我来的时候一直在找Syncing a fork
  • git fetch --prune
  • @MartinThoma 这是一个拉,有什么办法做推?我想通过本地推送将本地仓库同步到远程仓库

标签: git


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    为避免与您的工作副本(可能有本地更改)发生任何冲突,您首先清理所有未版本控制的内容(使用git clean)。然后你检查你要更新到的远程分支对应的本地分支,并使用git reset 将其切换到获取的远程分支。 (git pull 会将远程分支的所有更新合并到您的本地分支中,这可能会做同样的事情,或者如果您有本地提交,则创建一个合并提交。)

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


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

    git pull
    

    从工作目录内部。

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

    【讨论】:

    • 如果我在本地存储库中没有更改任何内容,只有 a.) 想要从远程获取所有内容的副本,并且 b.) 想要显示版本之间的差异。所以我不承诺,不改变任何东西=没有本地更新/更改。我应该定期(例如每周左右)使用哪些命令来实现上述两个功能?请回答 KISS(保持简单愚蠢)——我也是一个 git noob,ofc 将使用 RTFM——但首先需要帮助。 ;)
    • 我认为,在您的简单情况下,git pull 应该足够了。 (我更新了答案。)
    • 如果我有一些我不想提交的本地更改怎么办。现在,当我拉动时,它说我要提交它们或隐藏它们。那么在这种情况下,我如何告诉 git 覆盖这些并执行拉取操作?
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案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,这将覆盖您在分支branch_name 上的本地更改

      【讨论】:

        【解决方案5】:

        这些步骤可以做到:

        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.
        

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

        【讨论】:

        • 非常感谢更新与 github 和 bitbucket 完美配合 :)
        • 这个答案对我来说是最可靠的解决方案之一。
        • 您更新的答案是唯一对我有用的答案。谢谢老哥!
        【解决方案6】:
        git fetch --prune
        

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

        【讨论】:

        • 这就是我想要的!附言下次我会在挖掘 stackoverflow 之前更仔细地阅读手册页:-)
        • 是的,git pull -p 也是如此 - 'git pull 使用给定参数运行 git fetch 并调用 git merge 将检索到的分支头合并到当前分支中' - git-scm.com/docs/git-pull
        • 使用git fetch &lt;remote&gt; --prune,以防有人只需要--prune特定的遥控器。例如。 git fetch upstream --prune.
        • git fetch origin --prune 将您的本地仓库与 upstream 项目的分支同步
        • @SergiySokolenko 这就是我们所说的,但在内心深处,我们知道 SO 比手册页更方便:-P
        【解决方案7】:

        你想做的

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

        这使您的本地仓库与您的远程仓库完全相同。

        记得将 origin 和 master 替换为你想要同步的远程和分支。

        【讨论】:

        • 它还会从 npm install 和 bower install 中删除所有目录,不推荐,除非你想重新安装 .gitignore 中的所有依赖项
        • 它没有删除我的node_modules,它完全按照我的意愿工作。
        • 警告:它会删除未跟踪的文件
        • 我使用此代码丢失了所有数据,我尝试将本地存储库与 git 存储库同步。但它使我的全局存储库与我的本地存储库同步。
        • @ZahidKhan 我不知道到底发生了什么,但你描述的应该是不可能的。以上所有命令只会影响您的本地存储库,而不会影响远程存储库。
        【解决方案8】:

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

        如何从 git 同步一个 fork 仓库

        1. 检查你当前的 git 分支

          git branch

        2. 如果您不在 master 上,请向 master 结帐

          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

          如果我还拥有上游 repo 的提交权限,我可以创建一个本地上游分支并在上游进行工作。

        【讨论】:

        • 当我在第三步中已经收到错误时,为什么还要执行 5.git fetch upstream?
        【解决方案9】:

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

        命令: 请记住将 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 a 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$
        

        【讨论】:

          【解决方案10】:

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

          git config --global push.default current
          

          在执行 git clone 后,我总是使用此命令配置本地 git。虽然它可以在本地远程分支出现“Git fatal: The current branch has no upstream branch”错误时随时应用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-19
            • 2018-11-30
            • 1970-01-01
            • 1970-01-01
            • 2013-06-09
            • 2013-03-07
            相关资源
            最近更新 更多