有时在我提交之后,我发现我遗漏了一个文件,该文件也应该包含在提交中,但实际上并没有.我经常做的是再次提交.
git add the_left_out_file
git commit "include the file which should be added in the last commit"
Run Code Online (Sandbox Code Playgroud)
我认为这样做可能不是一个好主意,我想要做的只是在不添加提交的情况下包含文件.像这样的东西,
git add the_left_out_file
git add_staged_files_to_previous_commit
Run Code Online (Sandbox Code Playgroud)
可能吗?
我有一个关于Git基础知识的问题.
基本上,在Git中被称为"添加到索引"的行为是什么意思?我这样理解:
如果任何文件git计算SHA-1总和,那么基本上添加到索引意味着它计算SHA-1总和并将文件添加到暂存区域.
我对么?
虽然我经常使用Git,但我还是初学者.
有时,我犯了一个错误,但只有在我提交之后才发现它.在那时,我通常不得不花费很长时间在互联网上寻找我应该用来摆脱它的命令(在推送之前).
每当发生这种情况时,我发现自己想知道我经常遇到的四个术语之间的区别是什么:
我认为现在是时候一劳永逸地学习这些差异了.这些是什么?
我有一个包含两个分支的项目:master和gh-pages.它们本质上是两个不同的项目,其中gh-pages项目依赖于主项目(反之亦然).可以把它想象成"master包含源代码,gh-pages包含从这些源文件构建的二进制文件".我定期地接受在master中累积的更改,并使用提交消息"与主提交xxxxxxxx一致"对gh-pages分支进行新提交.

经过一段时间的这样做,我意识到,如果gh-pages提交"与主提交xxxxxxxx一致"实际上将xxxxxxxx作为其git存储库中的父项,那将会很好.像这样(糟糕的MSPaint艺术):

有没有办法让存储库看起来像上面的第二个图像?我知道如何使新的提交遵循这种模式:我可以做"git merge -s our master"(设置其他空提交的父项),然后是"git commit --amend adv550.z8"(其中adv550.z8)是实际正在改变的二进制文件).但git是否可以让您轻松回过头来为旧提交添加新父母?
一旦我让我的本地回购看起来正确,我完全愿意"git push -f"并且吹走我的Github存储库的当前历史.现在的问题是,可以让我的本地回购找吧?
编辑年后再添加:我最终放弃了尝试使git历史gh-pages看起来像这样的尝试; 我认为零收益太过分了.我的新做法是积极地压缩提交gh-pages,因为在我的情况下保存这些提交消息并不重要.(这只是"与主提交相符......"的长线,其中没有一个在历史上很有意思.)但是,如果我需要再次这样做,我会听到所说的答案
git merge $intended_parent_1 $intended_parent_2
git checkout $original_commit -- .
git commit --amend -a -C $original_commit
Run Code Online (Sandbox Code Playgroud) 从我所看到的,Git提交日期和作者日期仅精确到一秒.我想知道这是否与它们得到的一样精确,或者我可以得到毫秒甚至微秒的时间戳.
此命令使用第一次提交的提交哈希返回UNIX时间戳:
git show -s --format="%ct" 2d9afdfb9e2fa9b349312734b462bb7d57a684ee
Run Code Online (Sandbox Code Playgroud)
结果: 1421437899
什么是GIT的提交日期或作者日期时间戳精度?
我知道修改旧GIT提交的正确方法是使用rebase --interactive,但为了清楚这些概念,我想了解当我做什么时会发生什么
git checkout <commit>git commit . --amend当我这样做时,它不是修改提交,而是从同一提交的PARENT分支新的提交.
这只是GIT的方式告诉我,我不能修改已经有子提交的提交吗?
我一直在浏览"git merge-base",手册页,我无法理解多个合并库是如何发展的.具体来说,我挂在手册页中的下图中:
When the history involves criss-cross merges, there can be more than one best common
ancestor for two commits. For example, with this topology:
---1---o---A
\ /
X
/ \
---2---o---o---B
both 1 and 2 are merge-bases of A and B. Neither one is better than the other (both
are best merge bases). When the --all option is not given, it is unspecified which
best one is output.
Run Code Online (Sandbox Code Playgroud)
我无法理解如何创造这种情况.我试图使用测试存储库在分支之间重新创建这种纵横交错的合并情况,但我无法复制它.在所有情况下,我总是最终得到A和B指向的1个合并提交(而不是A和B指向独立的合并提交,如图所示).
谁能说明这种情况会怎样?这是常见情况还是错误情况?
您可以以编程方式仅编辑最后一次提交消息:
git commit --amend -m 'xxxxxxx'
Run Code Online (Sandbox Code Playgroud)
或者以交互方式随机提交:
git rebase -i HEAD~n
# Vim opens up, select the commit you want to modify, and change the word "pick" for "edit"
git commit --amend -m "Changing an old commit message!"
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
我如何结合两者?我想以编程方式更改消息,但是先前提交,而不仅仅是最后一次.
我想要修改的提交已经被推送到git服务器,但让其他人重新同步git项目并不是一个问题.
我看过这篇文章:http: //jenkins-ci.org/content/summary-report-git-repository-disruption-incident-nov-10th
它描述了用户意外触发git push --force存储库过时状态的事件.
当然,这需要一些清理来恢复原始状态分支.但是,由于Git从不删除信息,因为据我所知,这种清理过程总是可行的.
所以,即使你重新推出,推入--force(以及其他可能重写历史记录的操作)原始提交仍然在那里,他们只需要找到正确的?
简而言之,git中的任何(破坏性)操作实际上都会删除数据?
事实上,我发现了一些有趣的事情.我修改了对现有本地提交的更改.我知道这将改变原始提交的哈希 - 至少这是我的想法.但似乎git创建了一个完整的新提交.到目前为止没问题.
$ vim foo
$ git add foo
$ git commit -m "Edited Foo"
$ git log --oneline -n 1
5b122c7 Edited Foo
$ vim foo
$ git add foo
$ git commit --amend
$ git log --oneline -n 1
98f1e64 Edited Foo
$ git show 5b122c7 # wait what?
Run Code Online (Sandbox Code Playgroud)
git show 5b122c7 将向我显示原始提交 - 因此修改后的提交是一个有效的新提交.
但为什么旧的提交仍然在存储库中?好吧,原来的承诺可以回去.
但原始提交5b122c7甚至没有出现在git log --all
另一个git revert 5b122c7不会回归,5b122c7而是回到原来的提交.
我只是好奇这个问题,想知道:有没有办法找到原犯5b122c7有git log什么?如果我不知道原始提交的哈希值:我怎样才能找到哈希值?
如果我们签出提交而不是分支,HEAD(指向分支的指针)将指向提交而不是分支的名称(调用此提交A).这称为分离的HEAD状态.如果我创建了一个新的提交 - 提交B,那么新的提交将会丢失(好吧,也许不会立即),因为我们无法引用它(实际上,我没有得到它,因为每个提交都有一个ID,对吧?一旦我们知道ID,我们就可以引用它,但由于某种原因,Git将删除这些提交.可能Git无法告知提交属于哪个分支).
提交者只知道他们的父母,而不是孩子.是否有一个原因?如果提交A有提交B的引用,我们可以忘记分离的HEAD问题,对吧?但我想这会引起一些其他问题 - 那是什么?
git ×12
git-amend ×3
git-commit ×2
commit ×1
date ×1
git-log ×1
git-merge ×1
git-rebase ×1
git-revert ×1
rebase ×1
rollback ×1
timestamp ×1
undo ×1
unix ×1