git - stash 在 git 中是如何工作的 - 内部

标签 git

我在哪里可以获得有关 git 存储在内部如何工作的信息?我对类似于 9.2 Git Internals - Git Objects 中关于 git 对象的详细解释很感兴趣。 git-scm 书。

编辑: 我正在根据从 that link 收到的信息更新我的问题. 我下面描述的逻辑是否正确?
HEAD 在分支 br1 上。该分支上的最后一次提交“br1-c0”具有以下树:

somefile.txt(里面的文字 - '一些文字') 另一个文件.txt

我修改了 somefile.txt 以将“更新文本”作为内部文本。我正在存储更改:

1) 创建了一个提交,它有以下树: somefile.txt(里面的文字 - '更新的文字') 另一个文件.txt 并且具有指向提交“br1-c0”和文件索引状态的链接。

2) 工作树恢复为“br1-c0”提交。

最佳答案

Git 是开源的,所以源代码 ;)(或谷歌)

在任何情况下,存储都是提交列表。你可以通过创建一个 stash 来查看它们是如何构建的:

 # git stash --keep-index
 # git stash list
 stash@{0}: WIP on master: dafe337 sss
 # git log 'stash@{0}' | cat
 commit 7f86a90fb4e57590d6fe5026b7408306a757132a
 Merge: dafe337 2881ede
 Author: Maciej Piechotka <uzytkownik2@gmail.com>
 Date:   Fri Aug 30 09:27:10 2013 +0200

     WIP on master: dafe337 sss

 commit 2881ede55d619570a82bb7312257c4e43bd3b334
 Author: Maciej Piechotka <uzytkownik2@gmail.com>
 Date:   Fri Aug 30 09:27:10 2013 +0200

     index on master: dafe337 sss

 commit dafe33716c2e5aee994612c88d8142f1163c624e
 Author: Maciej Piechotka <uzytkownik2@gmail.com>
 Date:   Fri Aug 30 09:25:40 2013 +0200

     sss

Sss 是第一个提交(HEAD),而其余两个提交是当前索引的保存(暂存更改)并且 merge 包含未暂存更改:

% git show 2881ede55d619570a82bb7312257c4e43bd3b334
commit 2881ede55d619570a82bb7312257c4e43bd3b334
Author: Maciej Piechotka <uzytkownik2@gmail.com>
Date:   Fri Aug 30 09:27:10 2013 +0200

    index on master: dafe337 sss

diff --git a/test.c b/test.c
index b9a1dd0..7beafd5 100644
--- a/test.c
+++ b/test.c
@@ -1 +1,2 @@
 dddd
+fff
% git show 7f86a90fb4e57590d6fe5026b7408306a757132a
commit 7f86a90fb4e57590d6fe5026b7408306a757132a
Merge: dafe337 2881ede
Author: Maciej Piechotka <uzytkownik2@gmail.com>
Date:   Fri Aug 30 09:27:10 2013 +0200

    WIP on master: dafe337 sss

diff --cc test.c
index b9a1dd0,7beafd5..551a609
--- a/test.c
+++ b/test.c
@@@ -1,1 -1,2 +1,3 @@@
  dddd
+ fff
++ggg

现在存储列表是一个现有结构 - reflog (注:useful structure on its own)名字是……藏起来。所以 stashes 实际上是作为一个带有移动头的分支实现的,我们感兴趣的是 reflog。为了让它更有趣,我创建了第二个存储,它创建了提交 0dee308c461955e13a864c9a904a69d611e82730

% git reflog stash | cat
7f86a90 stash@{0}: WIP on master: dafe337 sss
% cat .git/refs/stash
0dee308c461955e13a864c9a904a69d611e82730
% cat .git/logs/refs/stash
0000000000000000000000000000000000000000 7f86a90fb4e57590d6fe5026b7408306a757132a Maciej Piechotka <uzytkownik2@gmail.com> 1377847630 +0200 WIP on master: dafe337 sss
7f86a90fb4e57590d6fe5026b7408306a757132a 0dee308c461955e13a864c9a904a69d611e82730 Maciej Piechotka <uzytkownik2@gmail.com> 1377847983 +0200 WIP on master: dafe337 sss

关于git - stash 在 git 中是如何工作的 - 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527171/

相关文章:

git - Azure DevOps 通过 REST API 获取链接到工作项的提交

git - 如何将标签推送到 CI 中的分支?

Git 只推送一个文件

git - 如何清理一个git项目

git - 如何设置 Yocto 配方以从本地 git 源构建?

git - 删除所有本地 git 分支

git - 具有两个不同父提交的两个提交之间的差异

git - 对 public_html 目录使用主分支克隆

linux - 如何在 git 中默认设置 --quiet 标志?

ios - 在 .gitmodules 中找不到子模块路径 'Pods' 的 url