git命令有千千万,每一个命令又可以带参数,时间久了就容易忘记,那怎么办呢?答案自然
按功能记忆,记住关键的,其他命令随用随查,那哪些常用呢,让我们从头建一个仓库开始:
(1)新建一个仓库:
git init .
解释: 在当前目录下初始化一个仓库,此操作会在当前目录下生成一个.git目录
(2)往仓库加入文件:
git add README
解释: 将README这个文件加入仓库进行管理
(3)查看仓库状态:
git status
命令返回:
git status .
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
(4)提交:
git commit -m "Add file README"
解释: 将之前的修改生成一个提交,仅仅是生成一个提交,不会推到远程的服务器,要推送需要使用git push命令
(5)追加提交
在(4)的基础上,如果又加了其他修改,此时如果不想生成新的提交,可以在追加提交,命令如下:
git add README 先add在commit
git commit --amend
(6)查看提交记录
git log
解释: 查看之前的提交记录
(7)增加远程仓库:
git remote add origin https://gitee.com/xboot/xboot
解释: 增加一个remote,因为我们是自己新建的git仓库,默认是没有remote的,如果是git clone别人的仓库,默认会自己加上remote。
(8)推送到远程仓库:
git push origin HEAD:refs/heads/master
解释: 将当前的HEAD推到origin指定的地址上,根据上文,origin是指:https://gitee.com/xboot/xboot
同理,我们可以不用增加remote而直接使用地址推送: git push https://gitee.com/xboot/xboot HEAD:refs/heads/master
可见,origin只是方便使用的一个代号而已,为方便还是需要加origin
(9)版本回退:
git reset e86c433e2c416984211642fb46a1ca98a69c74a4 --hard
解释: 上面的e86c433e2c416984211642fb46a1ca98a69c74a4是commit ID,想回退到哪里就输入对应的ID号,ID号如何查看呢? 请看上文的git log命令
(10)回退好了只后,我想回到回退之前的状态:
先git reflog查看ID号,再用git reset id --hard执行切换
(11)我想生成一个补丁发给在现场的同事,如何做?
git format-patch -1
生成3个补丁呢?
git format-patch -3
解释: 执行完了之后会在当前目录生成补丁。
(12)我是那个在现场的同事,收到大神alice发来的补丁,该如何打补丁呢?
git am file.patch
解释: file.patch是alice从上海发来的补丁。
(13)哎呀,我在现场收到补丁,但是我本地的版本不是最新的跟上海的alice的base不一致,换句话说我的代码太旧了,补丁打不上去,怎么办?
解决办法有多种:
a.让上海的alice通过git reset id --hard (参考上文第9点)切换到现场的版本,重新生成补丁(参考上文第11点)再发过来。
b.我本地先更新到于alice一致的最新版本,然后打上补丁,此时不会有任何冲突。
(14)好烦啊,alice好不容易修复了bug,给补丁到现场,还要求提供她指定版本的补丁,又当爹又当妈,吐槽归吐槽,活还是得干啊:
先回退到现场版本:
git reset e86c433e2c416984211642fb46a1ca98a69c74a4 --hard
然后 git am file.patch,此时一定提示有冲突,没关系,用文本编辑器打开补丁file.patch,照着补丁的内容手工修改代码,改好后
运行: git add . (参考第2点)
git am --resolved (新命令,类似新媳妇)
git format-patch -1 (参考第11点)
然后将生成的补丁发出去即可,上一个步骤明知道git am 会失败,为啥还要执行呢,是因为补丁里面已经有commit信息和ID了,
解决好冲突后git am --resolved就可以把补丁里面的commit信息打上去了,不需要再次commit。那如果我手动直接修改解决冲突,
然后git add然后git commit -m "some thing change"这样可行吗? 可以,但是会丢失原始补丁里面的邮箱和作者用户信息,保留
这些也是尊重作者的劳动成果体现。
熟悉以上命令,基本可以正常在公司使用git了,如果这些还不够怎么办呢? 后面遇到再补上呗。
(15)膝盖中了一剑,被问到分支是怎么回事?上文为何只字不提?别急,请注意上文的:
git push origin HEAD:refs/heads/master
解释: origin前面已经解释是个url, HEAD呢? HEAD是个别名代表最新的commit ID,
:refs/heads/先理解为固定格式,先不深究,也不需要深究,关键点在master,这个
远程的分支名,master是默认分支,那如果不推到master可以吗? 当然可以,我
经常这样使用:
git push origin HEAD:refs/heads/dev (dev是开发分支,注意远程不需要存在dev分支,直接推,远程没有dev回自动新建)
(16)谈到分支,不得不说如下命令:
git branch (查看本地分支)
git branch -r (查看远程分支,注意上文的dev分支git branch 是查看不到的需要用本命令,因为dev是远程分支)
(17)假设我在master分支上,dev分支有个问题需要我处理,改如何切换?
git reset origin/dev --hard
处理好了怎么切换回master分支?
git reset origin/master --hard