`checkout` = `reset` + `symbolic ref`?
`checkout` = `reset` + `symbolic ref`?
假设 a_branch
是一个现有分支,它指向与 HEAD
指向不同的提交(HEAD
可能直接或通过某些 branch
).
以下命令是否等价?
git checkout a_branch
和
git symbolic-ref HEAD ref/heads/a_branch
git reset --hard a_branch
另见 。
不,它们不是,如果您在 运行 命令之前进行了临时更改或脏更改。
如果您在 运行 宁 git checkout
之前修改了一个预先存在的文件,修改将在 HEAD
移动后继续存在。无论更改是暂存的还是脏的,都是如此。
在运行宁git reset --hard
时不成立。当您 运行 git reset --hard
.
我也想知道 git checkout
(和 git branch
)在 "plumbing" 命令中的真正含义。因此,我尝试了一个案例,我创建了一个新的分支,因为它只是为了学习基础知识。为了确保我不会错过任何东西,我从头开始:
Create a folder "Test" with one file "test.txt" and write
"Great content" into that file.
使用 git 书中的 chapter 10,我研究了以下序列:
git init
git add .
git commit -m "Init"
- EITHER 瓷器命令:
git branch b1
git checkout b1
- OR 管道命令:
git symbolic-ref HEAD
git update-ref refs/heads/b1 $(git rev-parse HEAD)
结果:两者重合!
详情。我将使用以下命令查看状态:
使用的命令来自 Git bash:
find .git/refs -type f
查找 .git/refs 中的所有文件
git symbolic-ref HEAD
指向符号 HEAD 引用,与 cat .git/HEAD
相同
git rev-parse HEAD
获取 HEAD 可访问的历史记录(提交、对象?)
git rev-list --objects --all
查看所有提交对象
git cat-file -p refs/heads/master
查看文件内容。
如果有没有共同历史的不同分支,则必须使用
git rev-list --objects --no-walk $(git fsck --unreachable | grep '^unreachable commit' | cut -d' ' -f3)
git reflog
显示一次提交和 HEAD 历史记录(仅一次提交)
Git瓷器命令
git branch -av
显示所有带有散列和消息的分支(如果有的话也显示远程!)。
在下文中,命令仅在结果为非空内容或自上一步后发生更改时才会显示。
初始化Git回购
git init # creates empty .git/ folder. HEAD exists but without history.
.git/objects 中没有对象。文件夹 /info 和 /pack 是空的。
.git/refs/ 为空
舞台变化
git add .
find .git/refs -type f # One object in c1/ created:
git cat-file -p c15479631b40176f3b09b7bc74ac5e189190e991 # yields "great content"
git cat-file -t c15479631b40176f3b09b7bc74ac5e189190e991 # yields "blob"
因此,在 refs/objects/
中创建了一个对象
提交更改
git commit -m "Init"
find .git/refs -type f # refs/heads/master created. Not empty. So have a look:
git symbolic-ref HEAD # refs/heads/master
git cat-file -p refs/heads/master # The full commit information including tree, author, commiter and commit message
git rev-parse HEAD # The hash to which HEAD points
git reflog # shows the HEAD history (just one commit)
# View all commit-objects. Everything is reachable by the commit:
git rev-list --objects --all
git cat-file -p $(git rev-parse HEAD) # Commit Hash changes with time. -t instead of -p yields "commit"
git cat-file -p 69b13879c229e1cc35f270db248910e5a828dc65 # -t yields tree
git cat-file -p c15479631b40176f3b09b7bc74ac5e189190e991 # -t yields blob
git branch -av
具有来自 git rev-parse HEAD
的散列的主分支已创建
* master 7845459 Init
创建分支
git update-ref refs/heads/b1 $(git rev-parse HEAD)
# refs/heads/master still there. refs/heads/b1 created. So have a look:
find .git/refs -type f
git symbolic-ref HEAD # Still at ref/heads/master
git cat-file -p refs/heads/b1 # The same result as from "git cat-file -p refs/heads/master"
git branch -av
b1 存在但未签出:
b1 7845459 Init
* master 7845459 Init
结帐 b1,即更新 HEAD
git symbolic-ref HEAD refs/heads/b1
git symbolic-ref HEAD # now at refs/heads/b1 => b1 checked out! Cross-check:
git branch -av
b1 签出:
* b1 7845459 Init
master 7845459 Init
希望对您有所帮助。
假设 a_branch
是一个现有分支,它指向与 HEAD
指向不同的提交(HEAD
可能直接或通过某些 branch
).
以下命令是否等价?
git checkout a_branch
和
git symbolic-ref HEAD ref/heads/a_branch
git reset --hard a_branch
另见
不,它们不是,如果您在 运行 命令之前进行了临时更改或脏更改。
如果您在 运行 宁 git checkout
之前修改了一个预先存在的文件,修改将在 HEAD
移动后继续存在。无论更改是暂存的还是脏的,都是如此。
在运行宁git reset --hard
时不成立。当您 运行 git reset --hard
.
我也想知道 git checkout
(和 git branch
)在 "plumbing" 命令中的真正含义。因此,我尝试了一个案例,我创建了一个新的分支,因为它只是为了学习基础知识。为了确保我不会错过任何东西,我从头开始:
Create a folder "Test" with one file "test.txt" and write
"Great content" into that file.
使用 git 书中的 chapter 10,我研究了以下序列:
git init
git add .
git commit -m "Init"
- EITHER 瓷器命令:
git branch b1
git checkout b1
- OR 管道命令:
git symbolic-ref HEAD
git update-ref refs/heads/b1 $(git rev-parse HEAD)
结果:两者重合!
详情。我将使用以下命令查看状态:
使用的命令来自 Git bash:
find .git/refs -type f
查找 .git/refs 中的所有文件
git symbolic-ref HEAD
指向符号 HEAD 引用,与cat .git/HEAD
相同
git rev-parse HEAD
获取 HEAD 可访问的历史记录(提交、对象?)
git rev-list --objects --all
查看所有提交对象git cat-file -p refs/heads/master
查看文件内容。
如果有没有共同历史的不同分支,则必须使用
git rev-list --objects --no-walk $(git fsck --unreachable | grep '^unreachable commit' | cut -d' ' -f3)
git reflog
显示一次提交和 HEAD 历史记录(仅一次提交) Git瓷器命令git branch -av
显示所有带有散列和消息的分支(如果有的话也显示远程!)。
在下文中,命令仅在结果为非空内容或自上一步后发生更改时才会显示。
初始化Git回购
git init # creates empty .git/ folder. HEAD exists but without history.
.git/objects 中没有对象。文件夹 /info 和 /pack 是空的。
.git/refs/ 为空
舞台变化
git add .
find .git/refs -type f # One object in c1/ created:
git cat-file -p c15479631b40176f3b09b7bc74ac5e189190e991 # yields "great content"
git cat-file -t c15479631b40176f3b09b7bc74ac5e189190e991 # yields "blob"
因此,在 refs/objects/
中创建了一个对象
提交更改
git commit -m "Init"
find .git/refs -type f # refs/heads/master created. Not empty. So have a look:
git symbolic-ref HEAD # refs/heads/master
git cat-file -p refs/heads/master # The full commit information including tree, author, commiter and commit message
git rev-parse HEAD # The hash to which HEAD points
git reflog # shows the HEAD history (just one commit)
# View all commit-objects. Everything is reachable by the commit:
git rev-list --objects --all
git cat-file -p $(git rev-parse HEAD) # Commit Hash changes with time. -t instead of -p yields "commit"
git cat-file -p 69b13879c229e1cc35f270db248910e5a828dc65 # -t yields tree
git cat-file -p c15479631b40176f3b09b7bc74ac5e189190e991 # -t yields blob
git branch -av
具有来自 git rev-parse HEAD
的散列的主分支已创建
* master 7845459 Init
创建分支
git update-ref refs/heads/b1 $(git rev-parse HEAD)
# refs/heads/master still there. refs/heads/b1 created. So have a look:
find .git/refs -type f
git symbolic-ref HEAD # Still at ref/heads/master
git cat-file -p refs/heads/b1 # The same result as from "git cat-file -p refs/heads/master"
git branch -av
b1 存在但未签出:
b1 7845459 Init
* master 7845459 Init
结帐 b1,即更新 HEAD
git symbolic-ref HEAD refs/heads/b1
git symbolic-ref HEAD # now at refs/heads/b1 => b1 checked out! Cross-check:
git branch -av
b1 签出:
* b1 7845459 Init
master 7845459 Init
希望对您有所帮助。