我遇到的最糟糕的一个是使用git子模块。我在github上有一个项目的子模块。该项目没有维护,我想提交补丁,但不能,所以我分叉了。现在子模块指向原始库,我需要它指向fork。所以我删除了旧的子模块,并在同一次提交中将其替换为新项目的子模块。事实证明这打破了其他人的存储库。我仍然不确定处理这种情况的正确方法是什么,但我最终删除了子模块,让每个人都拉动并更新,然后我创建了新的子模块,让每个人都拉动并再次更新。花了一天的时间来解决这个问题。
其他人做了什么,以非显而易见的方式意外搞砸了git存储库,你是如何解决它的?
答案 0 :(得分:15)
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
答案 1 :(得分:12)
这不是问题,而是 git cha。
答案 2 :(得分:7)
在没有意识到git config user.name
的情况下发布到公共存储库是不正确的
这意味着公共回购现在得到一个名字(和一封电子邮件)我根本不想发布。如果那个回购被复制,那就太晚了。
这就是为什么我更喜欢在我的git提示shell中显示我的user.name,这意味着不要这样:
MY_HOSTNAME /c/Prog/myGitProject (master)$
我明白这一点:
MY_HOSTNAME /c/Prog/myGitProject (master) VonC $
我知道我是谁,我在这个Git bash会话中输入的第一个命令!
答案 3 :(得分:6)
只有当你的比赛分布在一堆分支上时,才会在.gitignore
中意识到你forgotten an entry。
忘记git add不会添加不存在的内容......
git add . git commit git status //hey! why didn't it commit my deletes?, Oh yeah, silly me git add -u git commit --amend
git branch list
,则会获得一个名为list
的新分支,但如果您执行git stash
,则会将工作区隐藏起来;对于藏匿,如果你想要列表,你需要 list
很快,可能......
答案 4 :(得分:3)
答案 5 :(得分:2)
工作工作......
git commit
工作工作......
git commit
嗯...时间整合
git rebase -i origin/master
什么?冲突?让我们重新开始
git reset --hard origin/master
哭泣哭泣......
Git让您无需悔恨就可以擦除您当地的历史记录。最大的问题是你是安全网。
答案 6 :(得分:1)
使用git存储库时我最尴尬的时刻之一,尽管它更多关于sed:
我曾经在我的存储库的子目录中执行find ... -exec sed -i ...
操作。我在没有-i
的情况下测试了它,分心了,回来并设法切换到我的仓库中的顶级目录,然后再运行它。现在,git的重要文件都是只读的,但默认情况下sed -i
通过重命名将文件移除,然后写回原始文件,因此它在git的对象等只读文件上工作正常。替换是不可逆的,我不得不通过克隆并从追踪我作为遥控器的人那里获取来恢复存储库。
我甚至都没想过sed可以用于只读文件。故事的道德:使用sed -i -c
复制文件,然后尝试覆盖原文。
答案 7 :(得分:0)
创建一个新分支:
git branch new-branch
工作,提交,工作......让我的所有工作都在掌握,而不是在新的分支上。
我应该做的:
git checkout -b new-branch
为什么我不能做类似的事情:
git branch -c new-branch
(c for checkout),带有一个选项,使其成为默认行为???
答案 8 :(得分:0)
工作工作。开始进行更改。请注意,您不希望所有内容都提交。谨慎地进行部分提交。
最终确定这还没有为当前分支做好准备。我想将暂存的更改提交到新的临时分支。听起来很琐碎,对吗?
谷歌如何做到这一点。最佳答案是stash
,checkout -b newbranch
,stash pop
。不情愿地这样做,想知道为什么没有更简单的方法。
发现这完全消除了您的分阶段和非分阶段更改之间的区别。谢谢,Git!