我对Git一无所知
首先
我不懂Git。
为什么搞不懂呢?
解决方案可能为:通过查看.git/目录,可以将其视为文件更改,从而确认其动作并理解其机制。
试过之后才明白的事情总结
-
- branchというのは、言葉から想像していた線形のものではなく、特定のcommitを指す点だった。
-
- ファイルをステージングした時点で.git/object/内にバックアップが取られていた。(なのでこまめにaddするとリポジトリの容量が増えてしまう。)
-
- commitは差分ではなくスナップショットと言われている意味がわかった
-
- 至るところで現れるハッシュの使い道がわかった。
-
- stashはcommitだった
commit -ammedは上書きじゃなかった
resetは言葉から想像するいわゆるリセットではなく特定コミットへの切り替えがメインで、インデックスとワーキングツリーをリセットするのはおまけ
なぜ空のディレクトリを記録できないのかわかった(ディレクトリはgitオブジェクトではなく、indexでのファイルのパスでしかないため)
以下是对「など」的中文本地化解释:
等等、诸如此类、等等等等、等等之类。
在这篇文章中所涵盖的范围
我只需要用中文给出一个选项:
这是在GitHub前提下写的。
因为目标是让它尽快可用,所以不涉及git gc的操作。
不涉及pull命令中的fetch和merge,也不涉及checkout命令中的switch和restore。
1. “.git/” 是什么意思?
当您使用git clone从GitHub等远程存储库中克隆或者使用git init在本地创建本地存储库时,会出现这些情况。
1-1. .git/ 的内容
In Chinese: .git/文件夹内的内容
由于在展示整体形象,因此还会有一些未解释的词语,它们将在后面出现。
-
- 一部のファイルはバイナリファイルなので、エディタでそのまま開いても中身が見られません
- リポジトリの状態によって、ファイルやディレクトリはあったりなかったりします
文件结构
.git/
├ hooks/
│ ├ applypatch-msg.sample
│ ├ commit-msg.sample
│ ├ fsmonitor-watchman.sample
│ ├ post-update.sample
│ ├ pre-applypatch.sample
│ ├ pre-commit.sample
│ ├ pre-merge-commit.sample
│ ├ prepare-commit-msg.sample
│ ├ pre-push.sample
│ ├ pre-rebase.sample
│ ├ pre-receive.sample
│ ├ push-to-checkout.sample
│ └ update.sample
├ info/
│ ├ exclude
│ └ attributes
├ logs/
│ ├ refs/
│ │ ├ heads/
│ │ │ └ ブランチ名
│ │ ├ remotes/
│ │ │ └ リモート名/
│ │ │ └ HEAD
│ │ ├ stash
│ │ └ tags/
│ │ └ タグ名
│ └ HEAD
├ lost-found/
│ ├ commit/
│ └ other/
├ objects/
│ ├ info/
│ │ ├ commit-graph
│ │ └ packs
│ └ pack/
│ ├ pack-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.idx
│ └ pack-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pack
├ refs/
│ ├ heads/
│ │ └ ブランチ名
│ ├ remotes/
│ │ └ リモート名/
│ │ └ HEAD
│ ├ tags/
│ └ stash
├ AUTO_MERGE
├ CHERRY_PICK_HEAD
├ COMMIT_EDITMSG
├ config
├ description
├ FETCH_HEAD
├ HEAD
├ index
├ MERGE_HEAD
├ MERGE_MODE
├ MERGE_MSG
├ ORIG_HEAD
├ packed-refs
└ REBASE_HEAD
.git/hooks/ can be paraphrased as “.git/hooks/钩子” in Chinese.
这篇文章不会涉及hooks的13个示例文件,这些示例文件是作为挂钩脚本来运行的,只要去掉末尾的.sample即可。
.git/info/exclude -> .git/info/exclude
这类似于自己专用的.gitignore。
与.gitignore一样,将被排除在Git的管理之外。
不会影响其他仓库(例如远程仓库或他人的本地仓库)。
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.git/info/attributes – 仅供参考的选项
.git/logs/refs/heads/分支名称
提交的记录将会按照下方逐渐添加。
0000000000000000000000000000000000000000 commitのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 branch: Created from HEAD
.git/logs/refs/remotes/リモート名/HEAD 可以被转述为:.git/日志/参照/远程/リモート名/主分支
ref: refs/remotes/origin/ブランチ名
.git/logs/refs/stash 的意思是“存储暂存信息的日志路径”。
.git/logs/refs/tags/标签名称
.git/logs/HEAD 目录
本地的HEAD移动历史将被逐渐追加记录。
commitのハッシュ1(40桁) commitのハッシュ2(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 clone: from github.com:ユーザー名/リポジトリ名.git
.git/lost-found/commit/ 可将其原生翻译为:
. git / lost-found / commit /
.git/lost-found/other/ 的内容
只需要一种选择:.git/objects/info/commit-graph的翻译
.git/objects/info/commit-graph -> .git/objects/info/commit-graph
.git/objects/info/packs 的本地语言解释:贰辑放置信息文件夹
.git/objects/pack/pack-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.packへの参照
.git/objects/ 的文件夹中、
在一个只有两个字符名字的目录中,有一个文件名为38个字符的文件。
这个由2+38共40个字符组成的字符串将成为git对象的哈希值。
.git/objects/pack/ 这个路径是指向Git版本控制工具中的一个文件夹。
每次进行git gc,打包的文件将会被存储。(包括idx和pack文件)
每次进行git gc时,文件名会发生改变。
.git/refs/heads/ブランチ名的中文同义词是:.git/refs/heads/分支名。
这里指的是指向本地每个分支所指的提交。
ブランチのHEADが指すコミットのハッシュ(40桁)
.git/refs/remotes/RemoteName/HEAD
这是对远程分支的HEAD指向的分支的引用。
ref: refs/remotes/origin/ブランチ名
.git/refs/remotes/remoteName/branchName
这里包含了最后一次获取的远程代码库分支的提交信息。
リモートブランチのHEADが指すcommitのハッシュ(40桁)
.git / refs / tags / 标签名称
使用轻量级标签和注释标签会创建标签名称的文件。
tagオブジェクトのハッシュ
.git/refs/stash –> `.git/refs/stash`
最後に行ったstashのcommitのハッシュ
.git/AUTO_MERGE的中文谐意为:自动合并
コンフリクトしている状態のファイルを含むcommitのハッシュ
.git/CHERRY_PICK_HEAD的含义
我正在记录通过挑选精选提交并合并到分支上的commit。
cherry-pickしているcommitのハッシュ
.git/COMMIT_EDITMSG 的中文释义:这是一个路径名,它指向位于`.git`目录下的`COMMIT_EDITMSG`文件。
最後に実行したcommitのコミットメッセージ
.git/config 可以被重新说明为:配置文件中的 .git/config。
这里将记录上游分支的设置。
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "リモート名"]
url = git@github.com:ユーザー名/リモートリポジトリ名.git
fetch = +refs/heads/*:refs/remotes/リモート名/*
[branch "ローカルブランチ名"]
remote = リモート名
merge = refs/heads/上流ブランチ名
.git/description -> .git/描述
//翻訳:無名のリポジトリ。このファイル'description'を編集してリポジトリに名前をつけてください。
Unnamed repository; edit this file 'description' to name the repository.
用途的意思是指某物品或事物的用途或目的。
-
- gitweb
- リポジトリ名を動的に読み取るカスタムフックの開発用
.git/FETCH_HEAD -> .git/抓取历史
当我们执行git clone、git fetch等操作时,远程仓库的状态将被记录下来。
-
- git cloneやgit fetch(ブランチ指定なし)をした場合は複数が記録されている
- git fetch リモート名 ブランチ名などで1つのブランチだけfetchした場合は1つだけ記録されている
そのブランチが指すコミットのハッシュ(40桁) (not-for-merge) branch 'ブランチ名' of github.com:ユーザー名/リモートリポジトリ名
将被判定为不适合合并的分支将显示为「非合并」。
.git/HEAD -> .git/头
目前记录着当前的分支。
ref通常指的是分支。
当HEAD直接指向一个提交时,称为“分离HEAD”(从分支中分离出来的HEAD)。
可以通过.git/refs/heads/分支名来确认.git/HEAD中指示的分支的HEAD哈希。
ref: refs/heads/ブランチ名
.git/index – .git目录索引
因为它是二进制文件,所以即使用编辑器打开也无法查看其内容。
记录了正在追踪的文件。
.git/MERGE_HEAD是指向正在进行合并操作的分支的引用。
执行git merge命令时,它会记录要合并到分支的提交。
マージされるブランチ名のHEADが指すcommitのハッシュ
.git/MERGE_MODE 可以用以下的方式在中文进行翻译: “.git/合并模式”
这只是为了通知合并正在进行中。
(空)
.git/MERGE_MSG:合并消息
コンフリクト解消後のgit commitのデフォルトのメッセージ
.git/ORIG_HEAD可以被简单地翻译为”.git/原始头文件”。
当执行移动 HEAD 的命令时,会记录下执行命令时 HEAD 所指向的提交的哈希值。
commitのハッシュ(40桁)
.git/FETCH_HEAD的中文翻译选项:.git/拉取头
commitのハッシュ(40桁) branch 'ブランチ名' of github.com:ユーザー名/リポジトリ名
.git/packed-refs -> .git/packed-refs
运行git gc命令会删除不必要的提交等,并将引用(ref)合并到一个名为packed-refs的文件中。(即使不明确执行git gc命令,系统也会自动运行)
.git/REBASE_HEAD => .git/变基头
在执行rebase之前记录下分支的HEAD提交。
commitのハッシュ(40桁)
1-2. Git对象 (Git object)
Git对象(有4种类型)
-
- commit
-
- blob
-
- tree
- tag
从Git对象类型(根据哈希)
$ git cat-file -t gitオブジェクトのハッシュ
查看git对象
无法从工作树文件路径中确认。
因为相同的文件路径会保存多个blob对象,所以无法从文件路径唯一确定。
//gitオブジェクトのハッシュから確認
$ git cat-file -p gitオブジェクトのハッシュ
//ブランチ名から確認(ブランチ名の場合はcommitオブジェクト)
$ git cat-file -p ブランチ名
当我们使用git cat-file命令来查看commit对象时,可以确认到的内容。
-
- トップレベルのtreeオブジェクトへの参照
-
- コミットしたユーザーの情報
-
- タイムスタンプ
-
- コミットメッセージ
- 親コミットへの参照(1つ前のコミット)
通过使用git cat-file命令,可以确认blob对象的内容。
-
- blobオブジェクトの中身
- ※ファイル名やパスはblobオブジェクトではなくtreeオブジェクトに記録されているので、確認できません。
当我们使用`git cat-file`命令查看tree对象时,可以确认的内容。
用中文本地化为:
该tree对象所引用的每个Git对象的
-
- タイプ(blob or tree)
-
- ハッシュ
- ファイル名(ディレクトリ名)
当你对tag对象进行git cat-file操作时,可以确认的内容。
//現在のHEADが指すcommitオブジェクトに軽量タグをつける
$ git tag タグ名
//commitを指定して軽量タグをつける
$ git tag タグ名 コミットのハッシュ
//現在のHEADが指すcommitオブジェクトにアノテーションタグをつける
$ git tag -a タグ名 -m "メッセージ"
//commitを指定してアノテーションタグをつける
$ git tag -a タグ名 -m "メッセージ" commitのハッシュ
确认已经添加了标签。
$ git log
.git/refs/tags/会创建标签名
参照するcommitオブジェクトのハッシュ(軽量タグの場合)
参照するtagオブジェクトのハッシュ(アノテーションタグの場合)
确认标注标签(标签对象)。
$ git cat-file -p ハッシュ
object 参照するcommitオブジェクトのハッシュ(40桁)
type commit
tag アノテーションタグ名
tagger ユーザー名 <メールアドレス> UNIX時間 +0900
メッセージ
其他
//タグの確認(ローカル)
$ git tag
//タグの確認(リモート)
$ git ls-remote --tags
//タグの中身の確認
$ git show タグ名
//特定のタグを削除(ローカル)
$ git tag -d タグ名
//特定のタグを削除(リモート)
$ git push リモート名 --delete タグ名
//タグをリモートリポジトリにプッシュ(すべてのタグ)
$ git push --tag
//タグをリモートリポジトリにプッシュ(特定のタグ)
$ git push リモート名 タグ名
1-3. 参考(引用)
branch (分支) 指的是
这是在commit上的指针。当commit前进时,它会自动移动。可以通过分支名称指定commit。
分行的确认
Git操作 – Git操作可以理解为对Git版本控制工具的操作。
Please note that the provided translation from English to Chinese is a direct paraphrase of the phrase. Context may affect the accurate translation.
//branchの確認(ローカル)
$ git branch
//branchの確認(ローカルとリモート追跡)
$ git branch -a
$ git branch --all
//branchの確認(リモート追跡)
$ git branch -r
$ git branch --remotes
设置上游分支
Git 操作
//branchの確認(ローカルと上流の対応)
$ git branch -vv
//上流ブランチの設定(ローカルブランチとリモートブランチの紐付け)
$ git branch -u リモート名/リモート追跡ブランチ名 ローカルブランチ名
//上流ブランチの設定(ローカルブランチとリモートブランチの紐付け)の解除
$ git branch --unset-upstream ローカルブランチ名
在.git文件夹中发生的情况
如果进行设定,下面的内容会被追加,如果进行删除,它会消失。
[branch "ブランチ名"]
remote = リモート名
merge = refs/heads/上流ブランチ名
删除远程追踪分支
Git操作的同义词短语:
Git命令
//特定のリモート追跡ブランチの削除
$ git branch -d -r リモート名/リモート追跡ブランチ名
//リモート追跡ブランチの削除(リモートで削除されたもの)
$ git fetch --prune
$ git fetch -p
$ git remote prune リモート名
在.git文件夹中发生的事情
.git/refs/remotes/リモート名/ブランチ名将被删除。
创建分支
Git操纵
//現在のcommitからbranchを作成
$ git branch 作成するブランチ名
//特定のcommitからbranchを作成
$ git branch 作成するブランチ名 commitのハッシュ
//リモートブランチからローカルブランチの作成
$ git branch 作成するブランチ名 リモートブランチ名
在.git文件夹内发生的事情
- .git/refs/heads/ブランチ名が作成される
branchが指すcommitオブジェクトのハッシュ
-
- .git/logs/refs/heads/ブランチ名が作成される
- ログが下に追記されていきます。
親commitオブジェクトのハッシュ commitオブジェクトのハッシュ ユーザー名 <メールアドレス> Linux時間 +0900 branch: Created from 作成元のブランチ名
最初行的“親 commit 物件的哈希值”将会是“0000000000000000000000000000000000000000”。
最后行的 commit 物件的哈希值将与 .git/refs/heads/分支名 中所记录的值相匹配。
确认在`.git/refs/heads/`分支名称下所写的是一个提交对象的内容
使用git cat-file命令来查找保存在.git/refs/heads/分支名称文件中的哈希值。
$ git cat-file -p .git/refs/heads/ブランチ名のハッシュ
tree treeオブジェクトのハッシュ
parent 親commitオブジェクトのハッシュ
author ユーザー名 <メールアドレス> UNIX時間 +0900
committer ユーザー名 <メールアドレス> UNIX時間 +0900
$ git cat-file -t commitオブジェクトのハッシュ
commit
可以确认存在提交对象。
分支的切换
Git操纵
如果在工作区上有更改或者在暂存区后切换到其他分支而没有进行提交,会发生什么?
如果存在冲突的更改,就无法切换到其他分支(为了防止丢失工作,Git会阻止切换)
如果没有冲突的更改(即编辑部分不发生冲突,或者是新文件等情况),可以保留更改并切换分支。
//branchを指定して切り替え
$ git switch ブランチ名
//branchを作成して切り替え
$ git switch -c ブランチ名
//指定したコミットからbranchを作成して切り替え
$ git switch -d ブランチ名 branchを作成したいcommitのハッシュ
在.git文件夹内发生的事情。
- .git/HEADが更新される
ref: refs/heads/切り替え後のブランチ名
-
- indexが切り替え後のbranchの追跡済みファイルの情報に切り替わる
-
- FETCH_HEADはタイムスタンプが更新される
- .git/logs/HEADの下にログが追記される
游离的HEAD
如果不通过分支,直接引用提交对象,则状态会变为分离头(无分支)的状态。
用途可以为…
-
- 過去のcommitの状態の再現
- 実験的に変更を加えてみる
在分离的 HEAD 状态下切换到特定的提交
//ブランチ名を介さずコミットを直接指定して切り替える
$ git switch -d コミットのハッシュ
$ git switch --detach コミットのハッシュ
在分离的HEAD状态下,虽然可以进行commit,但当切换到其他分支时无法进行引用。
(如果记录了commit的哈希值,则可以回退。)
确认当前为”detached HEAD”状态
//確認
$ git status
HEAD detached at xxxxxx
//確認
$ git branch
* (HEAD detached at xxxxxxx)
可以在.git/HEAD中进行确认。
branchのパスではなく、直接commitのハッシュが記載されている
解离HEAD状态。
//試したものを破棄したい場合は他の既存のブランチに切り替える
$ git switch ブランチ名
//試したものを使いたい場合は、新規にbranchを作る
$ git branch ブランチ名
更改分支名称
Git 操作
//ブランチ名の変更(変更後の名前と同名ブランチがあると失敗)
$ git branch -m 変更前のブランチ名 変更後のブランチ名
//現在のブランチ名を変更する(強制上書き)
$ git branch -M 変更後のブランチ名
在.git文件夹内发生的事情
-
- .git/refs/heads/旧ブランチ名→新ブランチ名
-
- .git/logs/refs/heads/旧ブランチ名→新ブランチ名
- 現在のブランチの名前を変更すると.git/HEADも書き換わる
删除分支
Git操作指的是使用Git版本控制系统进行项目管理的过程。
//branchを削除(他のbranchにmerge済のbranchのみ)
$ git branch -d 削除したいブランチ名
//branchを削除(他のbranchにmergeしていないbranchも削除可能)
$ git branch -D 削除したいブランチ名
在.git中发生的事情
-
- .git/configが変更される
- リモートにpush済のbranchを削除すると、下記が削除される
[branch "削除したブランチ名"]
remote = origin
merge = refs/heads/削除した上流ブランチ名
-
- .git/refs/heads/ブランチ名 が削除される
- .git/logs/refs/heads/ブランチ名 が削除される
删除远程分支
//リモートブランチの削除
$ git push -dリモート名 ブランチ名
恢复已删除的本地分支
Git使用
为了确认要恢复哪个提交,我们将显示HEAD的历史记录。
$ git reflog
我会试着真正复活它。
$ git branch 復活後のブランチ名 HEAD@{n}
在.git文件夹内发生的事情。
- .git/refs/heads/復活後のブランチ名 が作成される
branchが指すcommitオブジェクトのハッシュ
- .git/logs/refs/heads/復活後のブランチ名 が作成される
0000000000000000000000000000000000000000 commitオブジェクトのハッシュ ユーザー名 <メールアドレス> Linux時間 +0900
branch: Created from HEAD@{n}
如果没有提交而切换分支(不使用stash的情况),
由于工作树中的文件和暂存的文件未与提交对象相关联,因此它们会与切换后的分支混合在一起(或者在冲突时无法进行切换)。
//ステージングがぶつかる場合
error: Your local changes to the following files would be overwritten by checkout:
Please commit your changes or stash them before you switch branches.
//ワーキングツリーがぶつかる場合(untracked fileがぶつかる)
error: The following untracked working tree files would be overwritten by checkout:
Please move or remove them before you switch branches.
如果在不提交变更的情况下切换分支(使用stash),
将文件储藏后切换分支并进行git stash pop,会进行自动合并。如果不产生冲突,在那个时刻,暂存区将保持原本存在的状态。如果产生冲突,将变为both added。在那个时刻检查暂存区时,同一个文件将有两份(哈希值不同)。如果解决冲突时只采用其中的一方,那一方的哈希值将保留不变。
暗中存放
在视觉上,将尚未进行本地提交的内容(无论是否处于暂存状态)临时避難一下(实际上将被提交)。暂存的对象是Git管理下的文件(未追踪的文件将不会被避避)。
使用案例
-
- いますぐ別のbranchで作業したいことができたけど現在の作業内容をcommitしたくないとき
- 作業ブランチを間違えたときに今までの作業(commitしていないものに限る)を正しいbranchに適用したいとき
Git的使用方法
//変更差分を退避させる(untracked fileは退避されない)
$ git stash
//変更差分を退避させる(名前付き、untracked fileは退避されない)
//git stash listで退避のリストを見るときに便利
$ git stash save スタッシュ名
//変更差分を退避させる(untracked fileも変更も退避される)
$ git stash -u
//変更を退避させる(ステージングしたファイルは除外)
$ git stash -k
$ git stash --keep-index
发生在.git内部的事情
当我进行存储的时候
-
- ORIG_HEADはかわらない
-
- HEADはかわらない(ハッシュは更新されないのでブランチ自体には影響を与えない)
-
- ワーキングツリーとステージングはHEADと同じ状態になる
-
- reflogは増える
-
- 「.git/refs/stash」と「.git/logs/refs/stash」が作成(すでにある場合は変更)される
-
- 「.git/refs/stash」は最新のstashのcommitのハッシュ
-
- 「.git/logs/refs/stash」は現在stashのcommitすべてのハッシュ
-
- stashはコミット(stashするものも、しないものも含むコミット) 親2つ 元々のコミットと、編集したファイル自体はblobオブジェクトとして.git/objects以下に保存されている
- .git/refs/stashが作成される
参照するcommitオブジェクトのハッシュ(最新のstash)
确认一下.git/refs/stash中记录的哈希值是什么。
$ git cat-file -p .git/refs/stashで参照されているハッシュ(40桁)
tree treeオブジェクトのハッシュ(40桁)
parent 親commitオブジェクト1のハッシュ(40桁)
parent 親commitオブジェクト2のハッシュ(40桁)
author ユーザー名 <メールアドレス> UNIX時間 +0900
committer ユーザー名 <メールアドレス> UNIX時間 +0900
WIP on ブランチ名: ハッシュ7桁 コミットメッセージ
可以看出这是一个具有最新commit和另一个commit为父的commit对象。
请确认另一个家长。
$ git cat-file -p commitオブジェクト1のハッシュ(40桁 or 7桁)
tree treeオブジェクトのハッシュ(40桁)
parent 親commitオブジェクト1のハッシュ(40桁)
author ユーザー名 <メールアドレス> UNIX時間 +0900
committer ユーザー名 <メールアドレス> UNIX時間 +0900
index on ブランチ名: ハッシュ7桁 コミットメッセージ
可以看出这个commit对象也有最新的commit对象作为其父节点。
如果有多个隐藏的地方
-
- .git/refs/stashには最新のstashのハッシュ値しか保存されない
-
- stashの一覧は.git/logs/refs/stashに保存されている
- .git/logs/refs/stashにすべてのstashの情報が書き足されていく
0000000000000000000000000000000000000000 commitのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 WIP on ブランチ名: stashした時のHEADのcommitオブジェクトのハッシュ(7桁) stashした時のHEADのcommitのコミットメッセージ
commitのハッシュ(40桁) commitのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 WIP on ブランチ名: stashした時のHEADのcommitオブジェクトのハッシュ(7桁) stashした時のHEADのcommitのコミットメッセージ
commitのハッシュ(40桁)
//reflogの最新に履歴が追加される
$ git reflog
xxxxxxx (HEAD -> ブランチ名) HEAD@{n}: reset: moving to HEAD
确认已撤退之物
//避難した作業の一覧を表示
$ git stash list
//git stash listとgit diffの合わせ技
$ git stash list -p
//stash履歴詳細
$ git stash show
//N番目にスタッシュしたファイルの一覧を表示
$ git stash show stash@{n}
//N番目にスタッシュしたファイルの変更差分を表示
$ git stash show -p stash@{n}
将已撤离的事物恢复
我将恢复存储的文件。
-
- ステージングもワーキングツリーも戻る
- 別ブランチで復元するとマージされるが、コンフリクトが起こる場合もある
//最新の作業を復元
$ git stash apply
$ git stash apply --index
//特定の作業を復元する
$ git stash apply スタッシュ名
$ git stash apply stash@{n}
//最新からn番目の作業を戻す
$ git stash apply n
//退避した中の最新の作業を復元する(戻した内容は退避リストから削除)
$ git stash pop
删除已撤回的内容
//避難した中の最新の作業を削除する
$ git stash drop
//特定の避難した作業を削除
$ git stash drop スタッシュ名
$ git stash drop stash@{n}
//最新から2番目のものを削除する
$ git stash drop 2
//避難した作業すべてを削除
$ git stash clear
在.git中发生的事情
-
- 最新のstashを削除すると、.git/refs/stashのハッシュが、その次に新しいものに書き換わる
-
- .git/logs/refs/stashから、削除したstashが消える
-
- stashをすべて消すと.git/refs/stashと.git/logs/refs/stashが削除される
- 削除したstashのcommitオブジェクトはそのまま残る
在删除分支之前,如果已经对文件进行了编辑,应该如何处理。
使用git stash命令将所做的更改暂存起来,然后创建并切换到一个新的分支,再使用git stash pop命令恢复之前暂存的更改。
//前回のコミット以降の操作を退避
$ git stash
//ブランチを作成して切り替え
$ git switch -c 新規作成するブランチ名
//退避した操作を再反映する
$ git stash pop
2. Git的操作及.git/文件夹内的变化
2-1. 阶段设备
创建文件
使用Git
//ワーキングツリーにファイルを作成
$ touch test.txt
在.git中发生的事情
此时,在.git文件夹内没有任何变动。
编辑文件
Git操作 (Git operations)
在这一点上,.git目录内没有任何活动。
舞台布置
Git的操作
在进行分阶段之前,请确认当前已索引的文件。
//現在インデックスされているファイル
$ git ls-files --stage
//.git/indexが持っている情報全部を表示
$ git ls-files --stage --debug
将先前创建的text.txt文件进行暂存。
$ git add test.txt
在.git中发生的事情
创建了一个 blob 对象的文件。
(由于是二进制文件,直接在编辑器中打开会出现乱码。)
xK��OR0`
使用cat-file命令确认文件的内容。
$ git cat-file -p ハッシュ
(ファイルの中身)
※ファイルの中身が空だと何も表示されない
index文件的内容将被更新。
$ git ls-files --stage
其他的分段
//部分ごとにステージング
$ git add -p ファイル名
//変更があったすべてのワーキングツリーの変更をステージングに加える
$ git add .
//変更があった追跡中のファイルのワーキングツリーの変更をステージングに加える
$ git add -u
确认已经索引的文件
$ git ls-files --stage
//.git/indexが持っている情報全部を表示
$ git ls-files --stage --debug
取消文件的暂存
不会影响工作区。
Git操作指使用Git工具进行版本控制和协作的过程。
//add前に戻す
$ git restore --staged ファイル名
$ git restore -S ファイル名
在.git文件夹中发生的事件。
- .git/indexが更新される
不追踪
工作区的文件保持原样。
Git操作 can be paraphrased as “Git的使用” in Chinese.
//インデックスから外す
$ git rm --cached ファイル名
//コミットしてローカルリポジトリから削除
$ git commit -m "コミットメッセージ"
在 .git 文件内发生的事情
- .git/indexが更新される
$ git ls-files --stage
$ git ls-files -s
ファイルの種類とパーミッション blobオブジェクトのハッシュ(40桁) コンフリクトフラグ パス/ファイル名
ファイルの種類とパーミッション blobオブジェクトのハッシュ(40桁) コンフリクトフラグ パス/ファイル名
ファイルの種類とパーミッション blobオブジェクトのハッシュ(40桁) コンフリクトフラグ パス/ファイル名
ファイルの種類とパーミッション blobオブジェクトのハッシュ(40桁) コンフリクトフラグ パス/ファイル名
2-2. 承诺
犯下
Git操作 is Git的使用方法.
$ git commit -m "コミットメッセージ"
在.git文件夹内发生的事件
-
- commitオブジェクトが作成される
-
- treeオブジェクトが作成される
-
- ブランチ名の指すcommitが変わるので.git/refs/heads/ブランチ名のハッシュが更新される
-
- .git/logs/HEADにログが追加される
- .git/COMMIT_EDITMSGに先程のコミット時のコミットメッセージが書き込まれる(最後のもののみ)
コミットメッセージ
- branchが新しく作成されたcommitオブジェクトを参照するようになる
新しく作成されたcommitオブジェクトのハッシュ
- .git/logs/HEADに履歴が追記される
commitのハッシュ(40桁) commitのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 commit (initial): コミットメッセージ
- .git/logs/refs/heads/ブランチ名に履歴が追記される
commitのハッシュ(40桁) commitのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 commit (initial): コミットメッセージ
查看此时点的git log.
$ git log
commit ハッシュ(40桁) (HEAD -> ブランチ名)
Author: ユーザー名 <メールアドレス>
Date: 曜日 月 日 時:分:秒 年 +0900
コミットメッセージ
确认此时的分期进行情况
$ git ls-files --stage
100644 blobオブジェクトのハッシュ(40桁) 0 test.txt
确认对象的类型
$ git cat-file -t
blobオブジェクトのハッシュ(40桁)
无论是 tree 还是 blob,在不同的 commit 中,对于没有更改的文件,它们的哈希值都是相同的,所以对象文件不会增加。反过来说,如果对更改进行暂存,它们会不断增加。
- .git/refs/heads/ブランチ名に格納されるハッシュが新しいcommitオブジェクトのものに書き換わる
提交覆盖
在内部,不是覆盖,而是创建了一个具有相同父提交的新提交。
Git的使用
//前のcommitに追加したい変更をステージングする
$ git add ファイル名
//commitの上書き(コミットメッセージ指定なし)
$ git commit --amend
//commitの上書き(コミットメッセージ指定あり)
$ git commit --amend -m "コミットメッセージ"
若未指定提交信息,则打开COMMIT_EDITMSG文件进行编辑后保存并关闭。
确认提交记录
$ git log
由于commit的哈希值发生了变化,我们可以知道另一个commit对象已经被创建。
原有的commit在被覆盖之前仍然存在,我们可以通过哈希值进行确认。
2-3. 指定commit的方法
使用分支名称进行指定
可以指定该分支所指向的commit。
以 commit 的哈希值指定
使用HEAD的相对关系来指定
当存在多个父母时,将选择首位的父母。
当有多个父母时,选择父母
//親が3つになる例
//untrackedファイルも含めたgit stash
$ git stash -u
$ git stash -a
//親が3つ以上になる例
//octopusマージ 現在のブランチに2つ以上のブランチをマージ
$ git merge --strategy=octopus ブランチ名1 ブランチ名2 ブランチ名3 ...
用符号参考进行指定
2-4. 远程仓库
这是一个用来进行多人开发的在线仓库,您可以在其中获取其他人的成果并共享自己的成果,以推动开发的进行。
分行的种类
git fetchやgit pullが成功すると更新される
実体は.git/refs/remotes/リモート追跡ブランチbranchの指定なしで git mergeしたときにマージ対象になるbranch
注册、删除远程仓库
在本地存储库中进行远程存储库的注册和删除。
Git的使用方法
//追加前の確認
//リモート名とリポジトリの一覧を表示
$ git remote -v
//リモートリポジトリをリモート名をつけて登録
$ git remote add リモート名 リモートリポジトリのurl
//追加後の確認
$ git remote -v
//リモートの登録を削除
$ git remote rm リモート名
//削除後の確認
$ git remote -v
在.git文件夹内发生的事情。
当使用git remote add命令添加远程仓库时,会附加下列内容;而使用git remote rm命令删除仓库时,会将其移除。
[remote "リモート名"]
url = git@github.com:ユーザー名/リポジトリ名.git
fetch = +refs/heads/*:refs/remotes/リモート名/*
其他
//リモート名の変更
$ git remote rename 変更前のリモート名 変更後のリモート名
//リモートの詳細を確認
$ git remote show リモート名
将commit发送到远程仓库
Git操作可以被简单描述为管理、跟踪和协作软件开发项目的一系列工具和命令。
//現在のbranchの変更をリモートブランチに反映させる(リモートと紐づけできている場合は「リモート名 ブランチ名」省略可能)
$ git push リモート名 ブランチ名
//現在のbranchの変更をリモートブランチに反映させる(リモート追跡ブランチとの紐付けもする)
$ git push -u リモート名 ブランチ名
$ git push --set-upstream リモート名 ブランチ名
//現在のbranchの変更をリモートブランチに反映させる(強制的)
$ git push --force-with-lease --force-if-include
在.git中发生的事情。
- -uオプションを付けてローカルで作成したbranchをpushした場合
[branch "ブランチ名"]
remote = リモート名
merge = refs/heads/上流ブランチ名
- .git/FETCH_HEADでpushされたbranchが一番上に表示される(ラグあり)
コミットのハッシュ(40桁) branch 'ブランチ名' of github.com:ユーザー名/リモートリポジトリ名
- .git/logs/refs/remotes/origin/ブランチ名が、そのブランチの初めてのpushの場合に作成される(更新の場合は下に追記されていく)
0000000000000000000000000000000000000000 コミットのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 update by push
如果在.git/refs/remotes/origin/中的分支名是该分支的第一次推送的情况下,就会创建(如果推送是更新的话,就会更新哈希值)
新しいコミットのハッシュ
其他
//リモートブランチの削除
$ git push --delete リモート名 リモートのブランチ名
$ git push -d リモート名 リモートのブランチ名
将远程仓库的最新信息带到本地仓库(远程跟踪分支)。
远程追踪分支的位置位于.git/refs/remotes/origin/分支名处。
Git 操作可以进行版本控制,用来追踪和管理代码的修改。
//リモート追跡ブランチも含めてローカルにあるブランチ表示
//(リモート追跡ブランチは前回fetch時の状態なのでリアルタイムに更新されていない)
$ git branch -a
リモートブランチはremotes/origin/ブランチ名の形で表示される
//リモートリポジトリのすべてのブランチの更新履歴をリモート追跡ブランチに取り込む
//(リモートで削除されているブランチがあっても、ローカルにあるリモート追跡ブランチは残ったまま)
$ git fetch
//リモートブランチの更新情報をリモート追跡ブランチに取り込む
$ git fetch リモート名 リモートブランチ名
//リモートで削除されたブランチのリモート追跡ブランチを削除
$ git fetch --prune
$ git fetch -p
在.git文件夹中发生的事情
-
- git fetchを実行すると.git/FETCH_HEADの内容に、取得したリモートリポジトリの状態が反映される
-
- git fetch –pruneを実行すると、リモートで削除されていたブランチに対応する下記ファイルが削除される
-
- 「.git/refs/remotes/ブランチ名」
- 「.git/logs/refs/remotes/origin/ブランチ名」
移動到已获取并检出的分支。
//リモート名不要で、ブランチ名のみ
$ git switch ブランチ名
$ git switch -c ブランチ名
- .git/refs/heads/ブランチ名が作成される
ブランチのHEADが指しているコミットのハッシュ
- .git/logs/refs/heads/ブランチ名が更新作成される(無い場合は作成される)
0000000000000000000000000000000000000000 コミットのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 clone: from github.com:ユーザー名/リポジトリ名.git
コミットのハッシュ(40桁) コミットのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 commit: コミットメッセージ
コミットのハッシュ(40桁) コミットのハッシュ(40桁) ユーザー名 <メールアドレス> UNIX時間 +0900 commit: コミットメッセージ
Git操作可以简单描述为一组在版本控制系统中使用的命令和操作。
检查分支的上游分支。
$ git branch -vv
在.git内发生的事情
仅仅参考而已,并不会发生任何事情。
合并远程分支的更改
如果远程跟踪分支被注册为上游分支,可以使用无参数的合并命令来获取更改。
$ git merge
我喜欢吃中国菜。
2-5. 比較
查看提交日志
通过跟踪当前的commit对象的父节点,可以显示到达的所有commit。
按照HEAD的顺序进行显示。
(如果将HEAD移动到过去的commit中,那么比它更新的commit将不会显示出来)
//現在のブランチのコミットログを出力
$ git log
//全ブランチのコミットログを出力
$ git log --all
//最後のN個のコミットのコミットログを出力
$ git log -n
//特定のファイルのコミットログを出力
$ git log --follow ファイル名
git log的显示选项
//コミット番号のハッシュ値を省略表記(7桁)で出力
$ git log --abbrev-commit
//グラフで表示
$ git log --graph
//コミットログ(簡易版)を出力(コミット履歴を1行1履歴)
$ git log --oneline
添加信息
//ファイルの修正内容を追加表示
$ git log -p
//変更されたファイルのパスと差分量を追加表示
$ git log --stat
//ファイル毎の削除、追加行数を追加表示
$ git log --numstat
//変更したファイルを追加表示
$ git log --name-status
筛选
//commitを日付で絞り込み(以降)
$ git log --after="YYYY/MM/DD"
$ git log --since="YYYY/MM/DD"
//commitを日付で絞り込み(以前)
$ git log --before="YYYY/MM/DD"
$ git log --until="YYYY/MM/DD"
//commitを特定のファイルのみで絞り込み
$ git log -- パス/ファイル名
//commitをコミッターで絞り込み
$ git log --author="ユーザー名"
//commitをコミットメッセージに含まれる文字列で絞り込み
$ git log --grep='コミットメッセージに含まれる文字"
//commitをマージコミットのみに絞り込み
$ git log --merges
//commitをマージコミット以外に絞り込み
$ git log --no-merges
//複数の親がある場合最初の親コミットのみを追う
$ git log --first-parent
//コミット1の子孫、かつコミット2の祖先のみに絞り込み
$ git log --ancestry-path コミット1...コミット2
文件状态比较
工作树和索引之间的差异
//ワーキングツリーとindexの差分
$ git diff
//ワーキングツリーとindexの差分(特定のファイルについて)
$ git diff ファイル名
索引和提交的差异
//indexとHEADの比較 (git diff --cached HEADと同義)
$ git diff --cached
//上記と同じ(git diff --staged HEADと同義)
$ git diff --staged
//indexとHEADの比較(特定のファイルについて)
$ git diff --cached ファイル名
$ git diff --staged ファイル名
//indexと特定のコミットの差分
$ git diff commitのハッシュ --staged
//indexと特定のコミットの差分(特定のファイルについて)
$ git diff commitのハッシュ --staged ファイル名
提交和提交的差别
//「最新のコミット」と「最新のコミットのひとつ前」との差分
$ git diff HEAD~
//「最新のコミット」と「最新のコミットのひとつ前」との差分(特定のファイルについて)
$ git diff HEAD~ ファイル名
//現在のHEADと特定のcommitの差分
$ git diff 比較するcommitのハッシュ
$ git diff 比較するブランチ名
//現在のHEADと特定のcommitの差分(特定のファイルについて)
$ git diff 比較するcommitのハッシュ ファイル名
$ git diff 比較するブランチ ファイル名
//特定の2つのcommitの差分
$ git diff commitのハッシュ1 commitのハッシュ2
$ git diff commitのハッシュ1..commitのハッシュ2
$ git diff ブランチ名1 ブランチ名2
$ git diff リモート追跡ブランチ名 ローカルブランチ名
//特定の2つのcommitの差分(特定のファイルについて)
$ git diff commit1のハッシュ commit2のハッシュ ファイル名
$ git diff ブランチ名1 ブランチ名2 ファイル名
$ git diff リモート追跡ブランチ名 ローカルブランチ名 ファイル名
工作区和提交的差异
//ワーキングツリーと特定のコミットの差分
$ git diff commitのハッシュ
//ワーキングツリーと特定のコミットの差分(特定のファイルについて)
$ git diff commitのハッシュ ファイル名
diff的显示选项
//ファイル名のみ表示
$ git diff --name-only
对diff进行筛选的选项
//変更した差分だけに絞り込み
$ git diff --diff-filter=M
//削除した差分だけに絞り込み
$ git diff --diff-filter=D
//リネームした差分だけに絞り込み
$ git diff --diff-filter=R
确认提交的内容
//特定のコミットの中身を確認
$ git show コミットのハッシュ
//HEADのコミットの中身を確認(HEADは省略可能)
$ git show HEAD
//コミットの中身を確認(ファイルを指定)
$ git show コミットのハッシュ:ファイル名
检查本地存储库的状态。
//staged/modified/untracked の一覧、差分情報などのステータスを表示
$ git status
//簡易形式で表示
$ git status -s
$ git status --short
请翻译成中国语:只需要一种选项。
stagedステージングされているファイル(indexとHEADに差分がある)modified変更されているファイル(ワーキングツリーとindexに差分がある)untrackedGitで追跡されていない、gitignoreによって無視されないファイル
查看特定文件行的变更历史。
//行の変更履歴(ファイル内で誰が何をいつ変更したか)
$ git blame ファイル名
行の変更履歴(ファイル内で誰が何をいつ変更したか) 省略形
$ git blame -s ファイル名
//ファイルの指定した行の変更履歴を出力する
$ git blame -L 行番号1,行番号2,... ファイル名
展示各个分支的提交
//各ブランチのcommitを表示
$ git show-branch
//リモート追跡ブランチも表示
$ git show-branch --all
//もっと多く表示
$ git show-branch --more=n
确认两个提交的分支源提交。
//2つのコミットが分岐したcommitのハッシュの確認(コミットのハッシュで指定)
$ git merge-base commit1のハッシュ commit2のハッシュ
//2つのコミットが分岐したcommitのハッシュの確認(ブランチ名で指定)
$ git merge-base ブランチ1 ブランチ2
2-6. 文件操作
请进行文件操作
修改文件名称
只有已被跟踪的文件才能进行重命名。不能对未被跟踪的文件使用git mv命令。
Git 操作
在进行分阶段之前,请先确认当前被索引的文件。
//リネーム前に現在インデックスされているファイルの確認
$ git ls-files --stage
//ファイル名の変更をステージングする
$ git mv 現在のファイル名 変更後のファイル名
//現在インデックスされているファイルの確認
$ git ls-files --stage
通过观察暂存区,我们可以发现文件名已经变化,但是哈希值没有改变。blob对象并不包含文件名信息,而是索引保留了文件的结构和名称。
在.git文件夹中发生的事情
-
- blobオブジェクトは追加なし
- .git/indexのファイル名が更新される
文件的移动
//移動前にインデックスされているファイルの確認
$ git ls-files --stage
//gitコマンドでのファイルの移動(1回でステージングされる)
$ git mv 現在のパス/ファイル名 移動後のパス/ファイル名
//gitコマンドを使わないファイルの移動(ステージングまで2手かかる)
$ mv 現在のパス/ファイル名 移動後のパス/ファイル名
$ git add 移動後のパス/ファイル名
//現在インデックスされているファイルの確認
$ git ls-files --stage
在.git文件中发生的事情
-
- blobオブジェクトは追加なし
-
- .git/indexのパス/ファイル名が更新されます。 (git mvでも、mv+git addでもblobオブジェクトのハッシュは変わりません。)
- (mv+addでもrenameになるのでcommitすると履歴が追えています。)
删除文件
如果在Git管理下的工作目录中手动删除了一个不在Git管理下的文件,那么它就像从一开始就不存在一样处理。
如果使用git rm命令删除了在Git管理下的文件,它将从索引中删除,因此不需要”添加”删除操作。
如果要使用rm命令而不是git rm命令删除在Git管理下的文件,则需要添加已被删除的文件。
//gitコマンドでのファイル削除(追跡済みファイルのみ有効)(1回でステージングされる)
$ git rm ファイル名
//gitコマンドを使わないファイル削除(追跡済みファイルの場合は別途addが必要)(ステージングまで2手かかる)
$ rm ファイル名
$ git add ファイル名
//gitコマンドでのファイル削除(ファイル削除をステージングする)(ワーキングツリーのファイルは残る)
$ git rm --cached ファイル名
刪除未被追蹤的檔案
//Gitで追跡されていないファイルすべてを確認
$git clean -n
//Gitで追跡されていないファイルすべてを削除
$ git clean
//Gitで追跡されていないファイルすべてを削除(強制)
$ git clean -f
//Gitで追跡されていない特定のファイルを削除(強制)
$ git clean -f ファイル名
//Gitで追跡されていないファイルを対話モードで削除
$ git clean -i
在.git文件夹内发生的事情。
-
- blobオブジェクトは消えない
- .git/indexから削除したファイルが消える
尽管在工作目录中删除了暂存文件,不进行add操作的情况下提交,则在索引中仍然存在,会包含在提交中。
只删除未被git追踪的文件。
//Gitで追跡されていないファイルすべてを確認
$ git clean -n
//Gitで追跡されていないすべてのファイルを削除
$ git clean -f
//Gitで追跡されていない特定のファイルを削除する
$ git clean -f ファイル名
更改文件夹名称
使用git ls-files命令可以查看暂存区(staging-area)中索引的文件。通过-s(–stage)选项,可以显示存储在仓库中的blob哈希值和文件名的列表。
//リネーム前に現在インデックスされているファイルの確認
$ git ls-files --stage
//ディレクトリ名の変更をステージングする
$ git mv 現在のディレクトリ名 変更後のディレクトリ名
//現在インデックスされているファイルの確認
$ git ls-files --stage
在暂存区中,你可以看到文件名已经改变,但哈希值并没有改变。
Blob对象并不保存文件名的信息,而是索引保存了文件的结构和名称。
在.git内所发生的事情
在.git/index中,目录名/文件名已经被修改。
切换目录
//リネーム前に現在インデックスされているファイルの確認
$ git ls-files --stage
//移動
$ git mv 現在のパス/ディレクトリ名 変更後のパス/ディレクトリ名
//現在インデックスされているファイルの確認
$ git ls-files --stage
在暂存区中可以看到文件名已经改变,但哈希值没有改变。
blob对象并不保存文件名信息。
索引保存着文件的结构和名称。
在.git文件夹中发生的事情
在.git/index中,已经更改了目录名/文件名。
删除目录及其内容
目录本身也是不同于树对象的一点。
//ワーキングツリーとステージングの両方を削除
$ git rm -r パス/ディレクトリ名
//ステージングのみ削除(ワーキングツリーのファイルは残る)
$ git rm -r --cached パス/ディレクトリ名
删除未被追踪的目录。
//Gitで追跡されていないディレクトリとファイルすべてを確認
$ git clean -dn
//Gitで追跡されていないディレクトリとファイルすべてを削除(強制)
$ git clean -df
//Gitで追跡されていない特定のディレクトリを削除
$ git clean -f ディレクトリ名
2-7. 文件恢复
当文件被添加到索引时,将其状态还原到工作目录。
如果没有指定提交,则将从索引中恢复。
Git的操作方式
//ステージングした時点の状態に復元 コミット識別子の引数が無い場合は、復元元は「インデックス」が対象
$ git restore ファイル名
//ステージングした時点の状態に、部分ごとに区切って復元箇所を指定
$ git restore -p ファイル名
在`.git`内发生的事情
- .gitでは何も起きない
恢复特定提交的文件
当文件被提交(commit)时,将其状态恢复到工作目录中。
也可以用于恢复已删除的文件。
Git操作指的是使用Git版本控制系统进行各种操作的过程。
//HEADから復元
$ git restore -s HEAD ファイル名
//HEADからいくつ前のコミットか指定して復元
$ git restore -s @~n ファイル名
$ git restore -s HEAD~n ファイル名
//commitのハッシュを指定して復元
$ git restore -s コミットのハッシュ ファイル名
//commitのハッシュを指定して部分ごとに区切って復元箇所を指定
$ git restore -p -s commitのハッシュ ファイル名
//コミット時点の状態をステージングに反映
$ git restore --staged ファイル名
//コミット時点の状態をワーキングツリーに反映
$ git restore --source=HEAD ファイル名
//コミット時点の状態をステージングとワーキングツリー両方に反映
$ git restore --source=HEAD --staged --worktree ファイル名
在restore的-s/–source选项中,您可以指定要恢复的提交。
发生在 .git 内部的事件
- .gitでは何も起きない
2-8. 头部的移动
可以使用git reset命令将当前位置移动到任意的commit。这里所说的”reset”并不是指回退某个版本,而是移动commit所引用的HEAD。通过选项,可以决定要将哪个时间点的状态反映到暂存区和工作目录。
确认当前的HEAD状态
Git操作
$ git log -1
发生在.git内部的事情
- .gitでは何も起きない
从.git文件夹中的文件中查找HEAD提交的哈希值。
现在的分支 de zhī)
ref: refs/heads/ブランチ名
从该分支名称的文件中检查哈希值。
現在のbranchが指すcommitのハッシュ(40桁)
头部的移动
Git操作 – 使用Git进行操作
//ステージングをHEADのコミット状態に戻す。ワーキングツリーとHEADはそのまま(add取り消し)
//git reset --mixed HEADと同じ
$ git reset
//特定のファイルをステージングからワーキングツリーに戻す(commit、indexを元に戻す)
//git reset --mixed HEAD ファイル名と同じ
$ git reset ファイル名
//コミットを指定してファイルを復元する(commit、indexをもとに戻す)
$ git reset commitのハッシュ ファイル名
为了确定要移到哪个HEAD,显示HEAD移动的日志。
//移動したいHEADを調べる
//HEADの移動履歴を出力
$ git reflog
//操作履歴数を指定して出力
$ git reflog -n
//実際にHEADを移動する
$ git reset --hard HEAD@{n}
发生在.git文件夹中的事情
-
- indexは戻したコミットまでの時点に戻っている
- commit、ステージ、ワーキングツリーに戻した先のHEADの状態が反映される
新しくHEADが指すcommitブランチのハッシュに書き換わる
由于提交对象(commitオブジェクト)只有对父提交的引用,因此在git log中无法显示子提交。
通过git reflog,可以查看过去HEAD的移动历史,因此可以移动到HEAD之前的提交。
reflog是ref(引用)移动的历史记录,因此是跨分支的历史记录。
也可以返回到其他分支的提交历史。
只能保留在工作目录和暂存区中的文件(因为变为完全提交时的状态)。
2-9. 更改提交记录的历史
在更改提交历史时,如果修改了相同部分,则可能发生冲突。
如果发生冲突,需要编辑以决定保留哪个修改。
确认马吉的情况。
//現在のブランチにマージされているブランチを出力する
$ git branch --merged
//現在のブランチにマージされていないブランチを出力する
$ git branch --no-merged
合并分支
将分支整合的过程称为分支合并。
Git操作
//現在のbranchに特定のブランチをマージする
$ git merge 特定のブランチ名
//現在のbranchに特定のbranchをマージする(コミットメッセージも指定)
$ git merge -m "コミットメッセージ" ブランチ名
//現在のbranchに特定のbranchをマージする(ファストフォワードマージでもマージコミットを作成)
$ git merge 特定のブランチ名 --no-ff
//特定のリモート追跡ブランチを特定のローカルブランチにマージする
$ git merge オリジン名/ブランチ名 ブランチ名
一旦发生冲突
//継続(競合を修正した後addとcommitを自分で行う)
$ git add
$ git commit
//継続(競合を修正した後mergeの続きを行う)
$ git merge --continue
//中止(コンフリクトの編集をしていないとき)
$ git merge --abort
//中止(コンフリクトの編集をしているとき)
$ git reset --hard HEAD
在.git文件夹中发生的事情
解决冲突时,如果只需要完全保留一方,则将保留其中一个blob对象。由于两者不完全相同,因此哈希值会发生变化,被视为新的文件。
-
- コミットが作られて1つ進む
- コミットメッセージは自動で入る
$ git log
Merge branch '取り込まれるブランチ名' into 取り込むブランチ名
- COMMIT_EDITMSGはそのまま
(merge元のbranchの最後のコミットメッセージのまま変化なし)
- commitがつくられて、HEADは1つすすむ
コミットのハッシュ(40桁)
//コミットログ確認
$ git log
1.マージしてできたcommit
2.取り込まれたブランチのHEADだったcommit
3.取り込むブランチのHEADだったcommit
ORIG_HEAD 是之前一直是 HEAD 的「要合并的分支的 HEAD 的提交」。
取り込むブランチのHEADだったcommit
マージされた時点の状態
合并的类型
合并操作有快进和非快进两种选项。
合并(快进)
因为分岔之后,其中一方没有前进,所以快进不会发生冲突。
实际上,它们并未真正合并,所以只有一个父母。
只有进行提交(不会创建合并提交=没有“合并分支”的历史记录残留)。
结果与直接向原来的分支提交没有区别。(后续变得难以撤销。)
合并(非快进式)
将合并后的内容作为提交信息保存。
由于进行了分支并且两个分支都在不同方向上进行了进展,可能会发生冲突。
取消合并
//マージが完了した後から取り消す
$ git reset --hard ORIG_HEAD
切换提交历史
将分岐的branch与另一方连接起来(在提交日志中,它会保留在rebase之前的时间戳,但与此无关,它会在其后面)。
连接的commit会受到以前的影响,因此它的哈希会改变。
当前的分支名称(被替换的分支名称)将被保留。
//2つのbranchが分岐したcommitのハッシュの確認
$ git merge-base ブランチ名1 ブランチ名2
//リベースを利用して現在のbranchを特定のbranchに付け替える
$ git rebase 付け替え先のブランチ名
//リベースを利用して現在のブランチを特定のbranchに付け替える(インタラクティブモード)
$ git rebase --interactive ブランチ名
$ git rebase i ブランチ名
请用中文复述下列内容,只需要给出一种选项:
The cat is sleeping under the table.
修改提交历史
//コミット履歴を改変する
$ git rebase -i 改変したい一番古いcommitより1つ古いcommitのハッシュ
对每个提交进行操作。
当使用rebase时发生冲突时
//リベース時のコンフリクト解消を中止
$ git rebase --abort
//リベース時のコンフリクト解消終了時に使用する
$ git rebase --continue
撤销 rebase
//戻りたい時点を確認する
$ git reflog
//戻す
$ git reset --hard HEAD@{n}
挑选精选的
导入特定的commit。
与差异不同,这是一个快照,因此导入的是commit时的状态,而不是commit所做的更改。
指定的commit将在cherry-pick之后添加到当前HEAD,并且HEAD将前进。
添加的commit哈希值将改变。
//特定のcommit時点の状態を取り込む
$ git cherry-pick 取り込むcommitのハッシュ
$ git cherry-pick ブランチ名
//複数のcommitをまとめてcherry-pickする(連続している場合)
$ git cherry-pick 取り込むcommitのハッシュ..取り込むcommitのハッシュ
//複数のcommitをまとめてcherry-pickする(連続していない場合)
$ git cherry-pick 取り込むcommitのハッシュ1 取り込むcommitのハッシュ2 取り込むcommitのハッシュ3
如果发生冲突
//チェリーピック時のコンフリクト解消作業を終了する(次にすすむ)
$ git cherry-pick --continue
//チェリーピック時のコンフリクト解消作業を中止する
$ git cherry-pick --abort
取消挑拣樱桃
//cherry-pickの取り消し
$ git reset --hard HEAD~
取消commit
创建一个新的commit来撤销特定的commit,并撤销该commit。
如果只有一个父提交
//HEADのcommitを打ち消す(コミットメッセージを編集する)
$ git revert HEAD
//特定のcommitを打ち消す(コミットメッセージを編集する)
$ git revert 打ち消したいcommitのハッシュ
//HEADのcommitを打ち消す(コミットメッセージを編集しない)
$ git revert HEAD --no-edit
//特定のcommitを打ち消す(コミットメッセージを編集しない)
$ git revert 打ち消したいcommitのハッシュ --no-edit
执行revert命令后,将进入编辑提交信息的界面,需在此输入。
如果父母是多个提交的情况下
一个具有多个父项的commit对象的例子是合并提交。
//親が複数ある場合は、親を指定するための-mオプションが必要
error: commit 打ち消そうとしたcommitオジェクトのハッシュ is a merge but no -m option was given.
确认目标合并提交,将第一个写的标记为1,第二个写的标记为2。
$ git revert -m 1 打ち消したいcommitのハッシュ
家人的身份核实方式
如果要通过git show确认的话
$ git show
commit commitオブジェクトのハッシュ
Merge: 親1のcommitのハッシュ(7桁) 親2のcommitのハッシュ(7桁)
Author: ユーザー名 <メールアドレス>
Date: 曜日 月 日 時刻 年 +0900
如果要通过 git cat-file 进行确认的话。
$ git cat-file -p commitオブジェクトのハッシュ40桁
tree trreeオブジェクトのハッシュ
parent 親1のcommitのハッシュ
parent 親2のcommitのハッシュ
author ユーザー名 <メールアドレス> UNIX時間 +0900
committer ユーザー名 <メールアドレス> UNIX時間 +0900
コミットメッセージ
如果要在git日志中进行确认
commit commitオブジェクトのハッシュ40桁
Merge: 親1のcommitのハッシュ(7桁) 親2のcommitのハッシュ(7桁)
Author: ユーザー名 <メールアドレス>
Date: 曜日 月 日 時刻 西暦 +0900
コミットメッセージ
请停止在提交之前进行否定和生成打消。
在撤销多个commit或者合并多个commit时使用。
$ git revert 打ち消したいコミットのハッシュ --no-commit
$ git revert 打ち消したいコミットのハッシュ -n
删除多个commit
每次取消commit,就会创建一个新的commit。(按照从最新的开始取消。)
//複数のcommitをrevertする(コミットメッセージを編集する) HEADでの指定
$ git revert HEAD(打ち消す中で最新のコミット)...HEAD~n(打ち消したい一番古いコミットより一つ古い)
//複数のcommitをrevertする(コミットメッセージを編集する) commitのハッシュでの指定
$ git revert 打ち消す中で最新のコミットのハッシュ...打ち消す最後のコミットより一つ古いコミットのハッシュ
//複数のcommitをrevertする(コミットメッセージを編集しない) HEADでの指定
$ git revert HEAD(打ち消す中で最新のコミット)...HEAD~n(打ち消したい一番古いコミットより一つ古い) --no-edit
//複数のcommitをrevertする(コミットメッセージを編集しない) commitのハッシュでの指定
$ git revert 打ち消す中で最初のコミットのハッシュ...打ち消す最後のコミットより一つ古いコミットのハッシュ --no-edit
打破打消否定
//revertで作成したcommitをrevertする
$ git revert 特定のコミットのハッシュ
//revertで作成したcommitを削除する
$ git reset --hard HEAD~n