从命令开始学习Git的入门指南,进行Git的解说
从命令行学习Git
目标读者
-
- gitを勉強中の人
-
- 機械的にfetchしてaddしてcommitしてpushみたいなのが出来るようになったけど業務に活かしたい人
-
- リモート追跡ブランチって何?って人
-
- HEADとかHEAD^って何?って人
-
- addとかcommitを取り消すコマンドを毎回ググっちゃう人
-
- コマンドで色々参照したい人
- エイリアスを設定したい人
(有不准确的描述之处)
分支
概念 – Concept
将分支进行一些分类考虑会更容易理解。
-
- 远程分支(在GitHub之类的地方)
-
- 远程跟踪分支(存在于本地的remotes/origin/某个分支)
-
- 跟踪分支(参考remotes/origin/某个分支的本地分支)
- 本地分支(仅存在于本地的分支)
个人认为,在理解Git的过程中,理解2和3可能是非常重要的。
如果执行git fetch命令,2会基于1进行更新。
顺便说一下,执行git pull命令会将代码合并到第三个追踪分支。
$ git branch [branch_name]
所以,你可以新建一个分支。
在那时,将会自动创建一个追踪“远程追踪分支”的同名“追踪分支”,请不要随意使用 git checkout -b 命令创建分支。
请一定要注意远程追踪分支。
当在新建远程追踪分支时,如果没有,可以通过以下的推送命令使用 -u 选项进行设置。
$ git push -u origin [branch_name]
如果你想自己指定要追踪哪个远程追踪分支,可以这样做。
$ git branch [branch_name] [origin/branch_name]
请参考以下中文翻译:
我同意。
所以,例如,
「我不明白本地分支的状态。想要与远程状态匹配。」
「远程分支被强制推送。」
如果出现这种情况,请按以下方式处理。
通过更新远程跟踪分支并创建跟踪分支。
$ git branch -D [branch_name]
$ git fetch
$ git branch [branch_name] [origin/branch_name]
or
$ git checkout [branch_name]
如果按照上述方法进行操作,它会自动在.git/config文件中添加设置。
相反地,如果在.git/config文件中添加设置,可以指定要获取的分支。
暂存代码
同时进行多个任务时,不能切换到其他分支!这样的情况经常发生吧。
请执行 git stash。
第一次使用git stash的人
只需记住两个。
暂时撤离
$ git stash
根据撤回的内容恢复原状
$ git stash pop
如果执行上述操作,可以采取”先备份,然后切换到分支,最后恢复到原来的状态”的方式。
稍微详细解释
在退避时添加评论
$ git stash save [comment]
显示存储的列表
$ git stash list
显示stash的摘要
$ git stash show [index(listで出てくるstash@{0}とか)]
指定索引的stash返回原来的状态
$ git stash apply [index]
如果在列表上应用了该操作,它不会从列表中消失,所以需要删除它。(如果使用pop函数,则会被删除)
$ git stash drop [index]
撤销git
我不小心添加了错的内容!我不小心提交了错误的内容!这些都会很有帮助。
每次都要谷歌搜索而又不懂的人,复制粘贴命令的时候,请理解以下两点。
三种RESET选项
-
- 无选项(或 –mixed)(对commit和add产生影响)
-
- –soft (仅对commit产生影响)
- –hard (对commit、add和工作目录都产生影响)
HEAD(代表分支位置的指示物)
-
- 可以把以下内容用中文翻译一遍,只需给出一种选项:
HEAD(可以理解为当前提交的位置)
HEAD^(上一个提交的位置)
(虽然可以引用前几个提交,但因为很少使用,如果有需要请自行搜索)
如果想要取消“add”操作,怎么办?
$ git reset
这是以下的缩写。
$ git reset --mixed HEAD
换句话说,因为没有选项(–mixed),所以对add和commit有影响。commit会定位到HEAD的位置,add也会定位到HEAD的位置。
只有进行了 add 操作而未进行 commit 操作时,由于尚未提交,HEAD 的位置没有(commit 没有)发生改变。
因此,这意味着”只取消add”。
如果想要撤销commit的话
我希望能回到先前的 commit 或 add。
$ git reset HEAD^
如果已经进行了add和commit操作,由于HEAD已经移动了一个位置,因此需要指定HEAD^。
→ 由于没有使用任何选项,所以add和commit都会移动到HEAD^。
我只想取消commit,add保持不变。
$ git reset --soft HEAD^
换句话说,由于使用了“–soft”选项,仅会影响到提交(commit)。提交会被放置在HEAD^(上一个提交)的位置。(对于–soft选项,添加(add)的状态不会改变)
如果想要放弃本地的更改内容,请在以下提供的选项中选择一个:
我想回到上一个提交的状态(更改将丢失,包括本地文件)。
$ git reset --hard HEAD^
由于使用了“–hard”选项,会影响到add、commit和working_tree。这将把所有内容重置到HEAD^(上一个提交)的位置。
虽然还没有提交,但是我仍然想要彻底清除本地的所有更改。
$ git reset --hard HEAD
如果既没有添加也没有提交,那么只有working_tree(本地修改)会移动到HEAD(当前提交)的位置。
git reflog 的中文翻譯是「Git 引用日誌」。
如果要进行 git reset –hard 操作,你应该记住这个命令。
当执行git reset –hard命令后,git log中将无法看到该内容。
$ git reflog
如果是这样,由于可以追踪HEAD的移动历史,也许以下方式可能会让它返回?(不能保证)
$ git reset --hard HEAD@{No}
其他一些方便的指令
在中文中进行本地化的直接表述:搜索
git grep [pattern] [(branch_name等指定可)]
(例)
$ git grep test_pattern master
如果使用git来grep文件的话,一般比使用常规grep搜索更快速。
日志- L
git log -L [start],[end]:[file_name]
(例)
$ git log -L 20,100:app/models/user.rb
显示 file_name 文件中从 start 行到 end 行的更改历史。
当使用这个短语时,可以询问这个变更的历史和背景是什么。
展示
git show [commit_id(git logとかで見る)]
git show [branch_name(or commit_id)]:[file_name]
(例)
$ git show asdfghjkl1234567890
$ git show master:app/model/group.rb
在查看指定提交的更改时(可以查看GitHub),特别是当想要引用另一个分支(或另一个提交)的文件时,如果不想费心切换分支的话。
挑花果
git cherry-pick [commit_id]
(例)
$ git cherry-pick asdfghjkl1234567890
将指定的 commit 合并到当前 HEAD(合并到当前分支)
例如,如果将整个分支合并会导致杂乱无章,只需合并所需的部分即可。
合并–压缩
git merge --squash
(例)
$ git merge --squash origin/feature
在合并时,可以将源提交合并为一个。
如果 origin/feature 与 commit1、commit2 和 commit3 之间有差异,可以将其合并并获取差异。可以将其作为 commit4 进行提交。
例如,在自己的工作分支上整理或合并混乱的提交非常方便。
(注意)请注意,它仍然是另一个提交,因此在使用 diff 检查时会出现提交差异。
有这种东西吗?的指令(额外内容)
把……二等分
git bisect start [なんかおかしくなったコミットID] [正常だった頃のコミットID]
(例)
$ git bisect start asdfghjkl1234567890 zxcvbnm0987654321
在哪个提交中,快速查找出了什么问题。
使用二分搜索自动检出提交并重复测试来确定原因的提交。
$ git bisect run [test_file]
因此,可以选择指定测试文件或手动测试后执行其中之一。
$ git bisect good
$ git bisect bad
查看当前的提交。
$ git bisect view
如果想要结束git bisect,
$ git bisect reset
提示
如果您完全理解了以上内容,请按以下设置,以更加舒适地使用Git。
注册别名
没有注册Git别名的人,如果注册的话,会变得稍微幸福一些。
我以为用 checkout(结账)作为 co 有些奇怪,但实际上感觉还挺舒适的。
$ git config --global --edit
因为vi打开了,所以在以下进行添加。
[alias]
st = status
br = branch
ci = commit
co = checkout
通过使用$ git st命令,可以查看git status的状态。