目录: ** 0x01 基础教程/0x02 分支流程/0x03 提交日志/0x04 变化比较/0x05 团队协作/0x06 高级用法/0x07 常见问题(FAQ)/0x08 掌握Git的秘诀
首先,这是一组我根据链接难度和相关性组织的懒人图解学习包:
Git简明指南 Git核心概念 Git clone/add/commit/fetch/diff/pull/pull -rebase 图解 Git 分支图解 如果你喜欢step by step完整掌握操作,并且愿意阅读英文指南,请看这个:Git how to其次,需要推荐Git Data Transport Command里的这张图,一图读懂Git的数据传输流程,对于通过理解来记忆命令非常有好处。为了便于修订和添加,我重新制作了这张图:
最后,@SoftwareTeacher提到了上图中的workspace/index/local repository三者都是用户在自己本机上的代码,比较让初学者困惑。我们可以对照下中英文术语解释下:
workspace,中文术语:工作区。就是本地代码目录下除去.git文件夹外的文件,这部分代码的任何变动通过git status可以看到是红色标示的。index,也叫stage area,中文术语:暂存区。暂存区域是一个文件,一般在.git目录中,保存了下次将提交的文件列表信息。在暂存区,还未提交到版本库的文件,通过git status可以看到是绿色标示的。local repository,中文术语:本地版本库。就是代码目录下的.git目录。本地版本库和暂存区的元数据都存储在.git目录下。本地版本库里含有本地创建的各个分支索引,以及远程版本库分支的索引信息。在local repository上的操作默认是针对当前分支。remote repository,中文术语:远程版本库。就是Github/Gitlab或者自己搭建的代码托管服务器上的代码仓库。把本地代码分为三个区,是git的一个特色,是一种解决本地复杂代码修改变动管理的方案,Git的基本操作在这三个区之间:
在工作目录中修改文件。暂存文件,将文件的快照放入暂存区域。提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。状态查看:Q:为什么git status的使用频率很高? A:git status是最高频的命令,用来查看当前状态以确认发生了什么,主要是下面三种常见情况:
红色的是workspace里新发生的变动。绿色的是已经执行过git add,从workspace添加到index的变动。解决冲突中当前冲突解决的状态日志:
Q: 如何diff文件的最后一次变动? A: git log -1 -p -- filename
Q: 如何查看两个分支之间的提交差异,例如branckA分支有的,而branchB分支没有的commit? A: git log branchB..branchA --oneline
Q: 如何查看最新1条日志,-ni表示最新i条日志,默认全部展示太多了: A: git log -n1
Q: 如何查看某个成员的所有日志: A: git log --oneline --author=feilong
Q: 如何过滤日志: A: git log --grep keyword
Q: 如何查看某个文件被那条.gitignore忽略规则所忽略? A: git check-ignore -v filename
Q: 如何方便的查看变动日志? A: 如果机子上装了lighttpd或者webrick则git instaweb或者git instaweb --httpd=webrick
Q: 如何同时查看每个分支的最顶端的commit? A: git branch -vv
Q: 如何查找哪些文件里含有一个字符串,例如函数名? A: git grep -l monitor
分支:
Q:如何查看所有分支 A:git branch -a
Q:如何切换到别的分支 A: git checkout other_branch_name
Q: 如何从别到分支合并到当前分支 A: git merge other_branch_name
Q: 如何以别的分支为基准在当前分支上重做 A:git rebase other_branch_name
提交:
Q:代码修改一半,需要临时更新代码修改一个BUG怎么办? A:把当前代码临时放到stash stack里:
入栈:git stash更新,修改并提交: git pull --rebasedo somethinggit add .git commit -m 'fix bug'git push origin master出栈:git stash pop冲突:Q: 遇到冲突的时候,如何只使用自己的版本? A: 取决于是merge还是rebase,在merge中--ours表示自己的版本,--theirs表示对方的版本,而rebase时相反,rebase顾名思义指以对方的版本为基准版本。
merge: git merge other_branch_name在merge中,使用自己的版本是:git checkout --ours,使用对方的版本是git checkout --theirs,两者都需要则要通过diff工具比对合并。git merge --continuerebase: git rebase other_branch_name在merge中,使用自己的版本是:git checkout --theirs,使用对方的版本是git checkout --ours,两者都需要则要通过diff工具比对合并。git rebase --continueQ: git pull和git pull --rebase的区别是什么? A:git pull=git fetch+git merge,而git pull --rebase=git fetch+git rebase,所以在两种情况下的冲突的解决同merge和rebase
Q:git cherry_pick怎么用? A:如果你想把分支A上的一个commit提取出来添加到分支B上,基本步骤是:
通过git checkout A切换到A分支 通过git log --oneline -n10查看A分支上最近N条记录(这里是查看了10条),复制你需要提取的那个commit的哈希例如是7f6eb072b7e。通过git checkout B切换到B分支 通过git cherry_pick 7f6eb072b7e将哈希值7f6eb072b7e对应的那个commit作用到当前分支,也就是分支B。如果有冲突,你需要解决下冲突。首先,我学习 git/svn/latex 之类的,基本做法是理解背后的原理,然后使用的过程中随时查手册,久了就通过肌肉记忆自然熟悉。像这里是latex的索引,但是我现在编辑latex比较少,有时候排版书籍的时候用的时候会去更新下。
其次,坚持使用git命令行来处理日常工作,学习git的原子指令。如果使用GUI,会习惯GUI的操作,但是对于git本身的常用操作会生疏,甚至不理解一个GUI复合了哪些原子的操作,出现问题的时候到底是哪个环节出问题。
最后,工欲善其事,必先利其器,即使是使用git命令本身,也有利器辅助。我用了2年多Mac系统,有一个历史命令自动完成的工具,叫fishshell,通过fish,我只要敲前面几个字母,后面就会灰色自动完成,上下键可以切换同类的敲过的高频命令,按向右的方向键自动完成。通过这种方式,我又比别人减少了大量输入错误导致的命令学习障碍,极大增加成功率。
转载于:https://www.cnblogs.com/math/p/git.html
相关资源:复古:运动-源码