git 现在已经非常流行了,大小公司都在使用。git 拥有非常丰富的命令,甚至有些让人头晕眼花,随便搜搜就有各种命令解释,但正所谓 “身体力行” 没有尝试过只是看了、背了命令依然无法理解其使用场景,所以此文以模拟场景方式来介绍 git 常用基本命令。
鄙人对 git 命令也不甚了解,只知晓常用的命令,因此这边文章并非教学而是当做自己备忘吧。
往往工作上面不需要我们创建 git 仓库,如果想了解自行搜索,略
git 仓库不需要我们创建,我们总得把代码下载下来才能用吧。那好,下面才是真本事,看好了!
命令:git clone [url]
栗子:git clone https://github.com/jquery/jquery.git
解释:我的解释就是没得解释 (原话出处:马小玲)
无论老牌的 svn 还是新潮的 git,版本管理工具最核心的就是分支概念。
什么是分支,这个问题还是举例说明吧。众所周知,同一个项目可能有多个研发同时进行,如果都在源代码上面进行修改有可能出现多人修改同一个文件的冲突问题,很有可能之前你改好的某块儿代码被人给覆盖了。那么我们可以每个人都复制一套代码在本地进行修改(这就是分支)然后完成工作后在合并到一起去(此时还有可能出现冲突,后面再说),这样的好处就是在修改过程中各自代码是独立的,不会再工作未完成时就发生冲突。
git 中,版本仓库会有个主干 (或叫主分支) 叫 master,开发时可以自己拉出分支(branch)完成工作后最终合并到 master 分支上,最后发布代码都是要发布 master 上的内容。
命令:git branch
解释:列出当前代码仓库下的所有本地分支,本地是指已经下载到当前电脑中的分支。
命令:git branch -r
解释:加了参数-r代表列出远程分支,即还未下载到当前电脑中的分支。
命令:git branch -a
解释:加了参数-a代表列出全部分支,就是上面两个的集合体。
命令:git branch [branch_name]
栗子:git branch myBranch
解释:在当前分支基础上,创建一个名为 myBranch 的分支。但是此时你并不会立即切换到新创建的分支上,你还是处于当前分支。
那么,问题来了。挖掘机技术哪家强? 我创建完分支后,如何切换到新创建的分支上?
命令:git checkout [branch_name]
栗子:git checkout myBranch
解释:检出 (可以理解为下载) myBranch 分支,并且代码切换到该分支
那么,问题又来了。我是个懒人,每次创建分支然后切换分支要两步操作,太麻烦。
命令:git checkout -b [branch_name]
栗子:git checkout -b myBranch2
解释:先创建名为 myBranch2 的分支,然后切换到该分支上。会有这种命令的存在,可见懒人真是不少啊。
命令:git checkout -d [branch_name]
栗子:git checkout -d myBranch2
解释:删除名为 myBranch2 的分支。
拉出分支来的目的就是要编辑和修改,完成之后还要提交合并到主分支上。
首先要有个概念,本地对于源项目工程的操作只是 “本地修改”,最终要提交到 git 服务器上工程仓库中。而想要提交到 git 服务器上工程仓库,须通过 “本地仓库” 提交,本地仓库由 “暂存区” 提交。也就是说,对于项目工程的任何修改,都必须先添加到 “暂存区” 然后再提交到 “本地仓库” 最后再提交到git 服务器上。
我们再来举个栗子吧栗子貌似有点儿多啊,屯粮过冬吗? 假设,我修改了 A、B 两个文件,将 A 文件添加到了暂存区,而 B 文件没有,此时提交我只会提交 A 文件的修改,B 文件不会有变化。这样应该就清楚了吧,还是看一下命令怎么用。
下面,假设我对项目的 README.md 进行了修改,要进行提交
命令:git add
解释:将当前路径下的所以文件,添加到暂存区
命令:git add [file1] [file2] ...
栗子:git add README.md tmp.txt test.txt
解释:指定多个文件添加到暂存区,可以带路径,文件名记得加上扩展名,多个文件以空格分割。
命令:git add [dir]
栗子:git add /Users/kevin/AndroidStudioProjects/test
解释:指定目录添加到暂存区,包括子目录
命令:git commit -m "[remarks]"
栗子:git commit -m "this is my test"
解释:将添加到暂存区的修改提交到本地仓库,备注为 this is my test。
命令:git commit [file1] [file2] ... -m "[remarks]"
栗子:git commit README.md -m "test"
解释:只提交暂存区中指定文件的修改,备注为 test
通过 1-2 应该大致理解了从本地—>暂存区—>git 服务器 的过程。但是如果出现这种情况该怎么办:我添加 A、B、C、D 这 4 个文件到暂存区然后准备提交到 git 上,突然发现 D 这个文不应该提交 (添加到暂存区时估计大脑短路了。也有可能是产品说之前那个功能不改了,虽然心中万草奔腾但还是得乖乖干活) 我总不能在 git commit 命令后面加上 ABC 这三个文件路径吧,如果在同一文件夹下还好说,若是不同路径下而且路径很长我只想吼一句 NDY。
命令:git rm --cache [file]
栗子:git rm --cache tmp.txt
说明:将 tmp.txt 移出暂存区,但是本地的修改内容依然不变。
最重要的是本地的修改内容依然不变别移出去了,之前修改的内容给我还原到版本库了内容了,那不得哭死啊。
命令:git push [local_branch_name] [server_branch_nam]
栗子:git push myBranch:myBranch
说明:将本地仓库的 myBranch 分支内容,提交到 myBranch 分支上。说起来感觉很复杂,简单来讲就是将 myBranch 中修改的内容从本地同步到服务器
如果你本地只有一个分支,那么命令就会更简单
命令:git push
说明:将本地的所有分支都提交到对应分支的服务器上,就是讲 myBranch 分支修改内容同步到服务器上,myBranch1 分支修改内容同步到服务器上。
为啥要说的这么复杂,因为 push 有很多玩儿法,比如:git push myBranch:master、git push origin master 大家自行搜索吧,我觉得没有比较把环境搞的那么复杂。
当完成当前分后要将分支合并到 master(或者任何分支) 上时,可以使用 merge 命令。但是其中可能会出现冲突,后面再说冲突的内容。需要注意的是 merge 命令是把指定的分支合并到当前分支上。
命令:git merge [branch_name]
栗子:git merge myBranch
解释:把 myBranch 分支合并到当前分支上。如果要将 myBranch 合并到 master 分支上,则要先使用 checkout 命令切换到 master 分支上然后再 merge
合并分支时可能会出现冲突,要想解决冲突先要明白为什么会出现冲突。假设有 A、B 两个人分别从 master 上拉出两个名为 A_branch、B_branch 的分支,他们修改了同一个名为 README.md 文件,其中一个人合并了自己的分支到 master 上,另一个人再合并自己分支到 master 上时则会冲突。因为他们共同拉去的 master 中 README.md 可以当做 1.0 版本,假设 A 完成修改 README.md 可以理解为 1.0_A 修改版本,然后 A 合并分支此时 master 中 README.md 版本可以当做是 1.1 版本,而 B 再合并到 master 上时是要将 README.md 自己的 1.0_B 修改版合并到 1.1 版本上去,可见本地版本低于 master 版本因此出现
当出现冲突的时候可能会出现如下提示
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
网上有好多方法,我就说个比较笨的方法吧。提示信息可以看出 README.md 文件有冲突,那么打开该文件冲突的地方会有如下标注:
<<<<<<< HEAD
myBranch
=======
myBranch1
>>>>>>> myBranch1
<<<<<<<和=======区间内容代表服务器上的,=======和>>>>>>>区间代表你当前分支的。你只需要手工修改后重新 add、commit 即可(别问我为什么!)