【问题标题】:What git gotchas have you been caught by?你被什么 git gotchas 抓住了?
【发布时间】:2010-12-08 12:15:26
【问题描述】:

我遇到的最糟糕的是 git 子模块。我在 github 上有一个项目的子模块。项目无人维护,我想提交补丁,但不能,所以我分叉了。现在子模块指向原始库,而我需要它指向 fork。所以我删除了旧的子模块,并在同一次提交中用新项目的子模块替换了它。事实证明,这破坏了其他所有人的存储库。我仍然不确定处理这种情况的正确方法是什么,但我最终删除了子模块,让所有人拉取并更新,然后我创建了新的子模块,并让所有人再次拉取并更新。花了一天的时间才弄清楚这一点。

其他人做了什么以不明显的方式不小心搞砸了 git 存储库,您是如何解决的?

【问题讨论】:

  • 这是stackoverflow.com/questions/1491766/…的骗子,答案应该合并。
  • “陷阱”与“反模式”并不是一回事。我问了关于仓库销毁的问题,他问了最坏的做法。

标签: git version-control


【解决方案1】:

adding a submodule 时通常的尾随斜杠:

当您在子模块上使用 git add 时,请确保您没有尾部斜杠。

> git add local/path
  -- adds the submodule

> git add local/path/
  -- adds all the files in the submodule directly into your repository, big no-no

【讨论】:

    【解决方案2】:

    这不是一个陷阱,这是一个 gitcha。

    【讨论】:

    • 大声笑 +1 有趣的 -1 应该是评论
    【解决方案3】:

    在没有意识到我的git config user.name 的情况下发布到公共存储库是不正确的。
    这意味着公共回购现在有一个我宁愿不发布的名字(和一封电子邮件)。如果该回购被复制,......为时已晚。

    这就是为什么我更喜欢在我的 git 提示 shell 中显示我的 user.name,而不是这样:

     MY_HOSTNAME /c/Prog/myGitProject (master)$
    

    我看到了:

     MY_HOSTNAME /c/Prog/myGitProject (master) VonC $
    

    从我在这个 Git bash 会话中输入的第一个命令就知道我是谁!

    【讨论】:

    • 设置一个您可以使用的全局用户名往往会避免这种情况。
    • @Tchalvak: 是的,但是你有几个本地存储库,每个都需要一个 不同的 名称来推送到它们各自的上游(远程)存储库...一个全局变量是不够。
    • 当然可以,但这变成了设置默认名称/电子邮件的问题,您在公开时没有问题,并且仅在特定情况下使用更敏感的名称/电子邮件。 耸耸肩
    【解决方案4】:
    1. 只有当匹配分布在大量分支中时,才会意识到 forgotten an entry.gitignore 中。

    2. 忘记 git add 不会添加不存在的内容...

      混帐添加。 git 提交 状态 //嘿!为什么它不提交我的删除?,哦,是的,我很傻 git 添加 -u git commit --amend
    3. 如果您执行git branch list,您将获得一个名为list 的新分支,但如果您执行git stash,您的工作区将被隐藏;对于存储,如果您想要列表,需要list...

    很快,可能……

    【讨论】:

    • 显然有 git add -A 两者兼而有之
    • 但是“什么不存在”是什么意思?
    【解决方案5】:
    1. 工作工作工作
    2. 存储更改
    3. 获取最新的
    4. 变基
    5. 获取冲突,解决它们
    6. 忘记“git rebase --continue”
    7. 流行隐藏
    8. 意识到我忘了“git rebase --continue”
    9. git rebase --abort
    10. 我最初隐藏的更改 - pfffft,消失了。

    【讨论】:

    • 不,这是一个小烦恼。您的存储仍然在您的存储库中,您只需要找到它。如果您的控制台会话中仍然显示哈希,那就去吧!如果没有,请使用 'git fsck' 找到它。有关详细信息,请参阅此 SO 答案:stackoverflow.com/questions/89332/recover-dropped-stash-in-git
    【解决方案6】:

    工作工作工作...

    git commit
    

    工作工作工作...

    git commit
    

    嗯...是时候整合了

    git rebase -i origin/master
    

    什么?冲突?让我们重新开始

    git reset --hard origin/master
    

    哭哭哭...


    Git 可让您毫无悔意地清除本地历史记录。最大的问题是是安全网。

    【讨论】:

    • 那么,git reflog 万岁。 :)
    • git reflog 允许我查看丢弃的提交吗?它只列出了活动,我做了一个reset --hard(更新了答案,它是不正确的)。
    • git reset --hard 是实际上可能击中自己的脚的主要方式之一。因此,我不再使用它了。我只是 git reset HEAD~1 然后 git checkout 必要的个别文件。
    • 这是完全错误的。你的历史还在那里,只是你不知道如何找到它。请参阅“git reflog”作为起点。找到你想要的提交,并为它创建一个分支。即使您以某种方式设法丢失了所有指向提交的指针,gc 也不会在 30 天(可配置)内将其删除。请参阅“git fsck”。用 git 真的很难真正失去一些东西。例如,使用 SVN,您可能一开始就没有提交这些更改,所以如果您丢失它们,它们就消失了。
    • 您在使用git reset --hard origin/master 时尝试输入什么命令?除了git rebase --abort,你为什么要中止失败的rebase?
    【解决方案7】:

    使用 git 存储库时我最尴尬的时刻之一,尽管它更多地是关于 sed:

    我曾经在我的存储库的子目录中执行find ... -exec sed -i ... 操作。我首先在没有-i 的情况下对其进行了测试,然后分心,回来并在运行它之前设法切换到我的仓库中的顶级目录。现在,git 的重要文件都是只读的,但sed -i 默认情况下会通过重命名将文件移走,然后写回原始文件,因此它在像 git 对象这样的只读文件上工作得很好。替换是不可逆的,我必须通过克隆和从远程跟踪我的人那里获取来恢复存储库。

    我从来没有想过 sed 会在只读文件上工作。故事的寓意:使用sed -i -c,它会复制文件,然后尝试覆盖原始文件。

    【讨论】:

      【解决方案8】:

      创建一个新分支:

      git branch new-branch
      

      工作,提交,工作......意识到我所有的工作都在 master 上,而不是在新分支上。

      我应该做的:

      git checkout -b new-branch
      

      为什么我不能这样做:

      git branch -c new-branch
      

      (c for checkout) 可以选择将其设为默认行为???

      【讨论】:

      • git checkout -b new-branch 将是第一件事。之后要解决这个问题,git checkout new-branchgit merge master(现在两个分支上的状态相同)、git checkout master 和最后git reset --hard origin/master 让你的主人回到原始状态。
      【解决方案9】:

      工作工作工作。开始进行更改。请注意,您不希望所有内容都已提交。小心地进行部分提交。

      最终决定这还没有为当前分支做好准备。我想将分阶段的更改提交到一个新的临时分支。从概念上讲,这听起来很微不足道,对吧?

      谷歌了解如何做到这一点。最佳答案是stashcheckout -b newbranchstash pop。不情愿地这样做,想知道为什么没有更简单的方法。

      发现这完全消除了分阶段更改和非分阶段更改之间的区别。谢谢,Git!

      【讨论】:

      • 工作工作工作。在git statusgit diffgit add 的多次迭代中进行非常谨慎的部分提交。决定你已经完成了,git commit -a。哇哇哇 :(
      • 只提交当前分支中的更改。然后,提交正在进行的剩余工作。切换到一个新分支,在那里挑选提交。在上一个分支中,使用 git revert 删除先前挑选的提交上不需要的更改。最后,git reset @~3 可以从您离开的地方继续。 ;-)
      • @UlrichEckhardt 是的,这就是我现在所做的。先提交,以后再考虑分支。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多