Git 暂存和快照
Git staging and snapshots
我最近忘记在提交之前将我的遥控器的最新版本拉到我的本地。没什么大不了的,我只是把我的改变藏起来,然后从远程拉出来。这导致与其中一个文件发生冲突,我还注意到许多其他文件被暂存。所以我解决了冲突,然后从暂存区中删除了所有文件(我对它们一无所知)除了我解决冲突的文件,最后我提交并推送了我认为是那个文件的文件。
原来我对 git 工作原理的理解是有缺陷的,我推送了我本地工作区的快照(没有我试图从远程获取和合并的许多其他文件)。这有效地从远程分支新头(我的提交)
中删除了这些文件
我的猜测是这些问题之前已经被问过,但我找不到它们所以这里是:
是否需要暂存文件?如果 git 只是提交了整个本地工作区的快照,那为什么要索引任何东西?最后有没有一个命令(我可以创建一个别名)来包装 pull 和 commit,这样我就不会忘记在再次提交之前拉,所以它会获取、合并、提交?还是命令不存在的原因?
感谢您的宝贵时间
当您执行 git commit
时,您会记录整个工作目录的快照,但没有必要 您的工作目录。
也就是说,您可以在很多文件中进行大量更改,并且只在提交中包含其中的一些更改。这并不意味着那些其他文件不是提交的一部分:从技术上讲,所有未更改的文件都是该提交的一部分,它们只是不属于 commit diff.
索引或阶段对于准备您要提交的工作目录的状态很有用。如果你不需要那个,只是想提交任何更改,你可以只做 git commit -a
。这不会添加新文件,只会添加已更改的文件。如果你还想添加所有新文件,你可以做 git commit -au
.
关于你之前的烂摊子。一旦你知道了基本规则,这实际上很容易。 git 的基本规则是:如有疑问,请提交。
在你的情况下会怎样?让我们看看:
- 你忘记拉了,工作了一点。
- 做
git commit
!当然是到您当地的 master
分支机构。
- 执行
git push
失败,因为您的远程分支已推进。
- 执行
git fetch
以获取最新更改。
- 执行
git merge
或 git rebase
将您的更改与来自 origin
的更改混合。
- 如有冲突,解决并
git merge/rebase --continue
。
- 做
git push
并获利!
解决冲突的唯一机会是解决问题。如果发生这种情况,git merge/rebase --abort
会将您恢复到上次正确的提交。
关于执行所有操作的命令...当心! git pull
已经是 git fetch
加上 git merge
(或 git rebase
)的组合。它可能会节省你一些时间,但如果你正在学习 git 我非常建议不要使用 git pull
而是单独执行其他两个命令。
同时进行 git commit
、git pull
和 git push
可能不是一个好主意。
我最近忘记在提交之前将我的遥控器的最新版本拉到我的本地。没什么大不了的,我只是把我的改变藏起来,然后从远程拉出来。这导致与其中一个文件发生冲突,我还注意到许多其他文件被暂存。所以我解决了冲突,然后从暂存区中删除了所有文件(我对它们一无所知)除了我解决冲突的文件,最后我提交并推送了我认为是那个文件的文件。
原来我对 git 工作原理的理解是有缺陷的,我推送了我本地工作区的快照(没有我试图从远程获取和合并的许多其他文件)。这有效地从远程分支新头(我的提交)
中删除了这些文件
我的猜测是这些问题之前已经被问过,但我找不到它们所以这里是:
是否需要暂存文件?如果 git 只是提交了整个本地工作区的快照,那为什么要索引任何东西?最后有没有一个命令(我可以创建一个别名)来包装 pull 和 commit,这样我就不会忘记在再次提交之前拉,所以它会获取、合并、提交?还是命令不存在的原因?
感谢您的宝贵时间
当您执行 git commit
时,您会记录整个工作目录的快照,但没有必要 您的工作目录。
也就是说,您可以在很多文件中进行大量更改,并且只在提交中包含其中的一些更改。这并不意味着那些其他文件不是提交的一部分:从技术上讲,所有未更改的文件都是该提交的一部分,它们只是不属于 commit diff.
索引或阶段对于准备您要提交的工作目录的状态很有用。如果你不需要那个,只是想提交任何更改,你可以只做 git commit -a
。这不会添加新文件,只会添加已更改的文件。如果你还想添加所有新文件,你可以做 git commit -au
.
关于你之前的烂摊子。一旦你知道了基本规则,这实际上很容易。 git 的基本规则是:如有疑问,请提交。
在你的情况下会怎样?让我们看看:
- 你忘记拉了,工作了一点。
- 做
git commit
!当然是到您当地的master
分支机构。 - 执行
git push
失败,因为您的远程分支已推进。 - 执行
git fetch
以获取最新更改。 - 执行
git merge
或git rebase
将您的更改与来自origin
的更改混合。 - 如有冲突,解决并
git merge/rebase --continue
。 - 做
git push
并获利!
解决冲突的唯一机会是解决问题。如果发生这种情况,git merge/rebase --abort
会将您恢复到上次正确的提交。
关于执行所有操作的命令...当心! git pull
已经是 git fetch
加上 git merge
(或 git rebase
)的组合。它可能会节省你一些时间,但如果你正在学习 git 我非常建议不要使用 git pull
而是单独执行其他两个命令。
同时进行 git commit
、git pull
和 git push
可能不是一个好主意。