前言
本系列文章,将在各路大神文章的基础上,总结提炼出自己的感悟,力求将大神的观点总结的更加凝练,希望站在巨人的肩膀上,能看得更远
请务必先在无实际作用的测试工程中练习Git命令
——《鲁迅没说过的话精选集》
在还没有很熟悉Git命令之前,请务必先确认输入的指令是否是你想要的效果,如果不能确定,还是先使用可视化工具
——《跑路程序员告诫你的二三事》
本篇引用文章
廖雪峰大神的专题文章--史上最浅显易懂的Git教程!
另外,参考了这里:
易百教程--Git教程
内容提要
作为一名程序员,Git/SVN是我们每天都要打交道的东西(本篇不讨论SVN),然而,我们真的会用Git吗?你是不是也和我一样,只会git clone
git pull
git commit
git push
呢?如果你也是,请跟随我,在廖雪峰大神的带领下,一起重新学习一下Git的使用吧
当然有人会说,这都9102年了,GitHub for Desktop、Source Tree、TortoiseGit、SmartGit了解一哈,确实,各种工具为我们屏蔽了复杂的命令,提供了方便。但是,如果你基本不怎么了解Git有什么命令,以及常用命令的作用,那么,在你遇到一些突发情况时,你往往无法处理(也是我的亲身体会),所以我认为,虽然大部分时候我们还是会用工具去做事,但是还是有必要学习一下基本的命令
Git简介+安装
创建Git工程
初始化本地目录
git init
//正常情况下,输出如:
//Initialized empty Git repository in D:/work/code/gitLearning/project1/.git/
//就是成功啦
新建远程仓库
- 1.打开Github,注册并登陆,这个就不详细说了
-
2.
-
3.
- 4.
创建好就长这样,有三个指引,分别对应初始化一个本地库并关联到远程库
关联本地库到远程库
用其他远程库来初始化当前库
关联仓库
关联本地库到远程库
git remote add origin git@github.com:NotSeriousCoder/GitLearning.git
git push -u origin master
首次提交,如上图报错,后来尝试了,在本地工程目录新建一个文件
aaa.txt
(当然一般是新建一个README.md文件),然后提交如下:
git add
git commit -m "first commit"
git remote add origin git@github.com:NotSeriousCoder/GitLearning.git
git push -u origin master
//这里如果你的key设置了密码,需要输入密码
//Enter passphrase for key '/c/Users/Bingor/.ssh/note':***
用其他远程库来初始化当前库
-
1.
-
2.
-
3.
-
4.
从远程仓库克隆
如果本地没有仓库,只有远程仓库,也可以直接从远程克隆下来,如下:
git clone git@github.com:NotSeriousCoder/GitLearning.git
多人协作
提交代码
//如果有新的文件/文件有变动
//git add 目的是让Git追踪文件变化,将文件的变化放入暂存区
git add xxx.xxx
//如果有多个文件变化,可使用 -A 来追踪所有变动
git add -A
//如果不清楚有哪些文件有变化,可以使用git status,会列出上一个Commit之后的所有变动
git status
//如果嫌输出的信息过于繁琐,可使用 -s 来简化输出
git status -s
//提交
git commit -m "commit说明"
推送代码到远端
commit好代码,我们通常需要将其推送到远端仓库(至少每天下班得推一次,不然太久不推,比较差异你就得疯)
然而你不能直接把代码推到远端,因为你的小伙伴大概率也会去修改提交代码
所以在推送之前,你需要将可能的远端变更先拉取下来
//远程主机名一般默认是origin,远程分支名则是你需要拉取的远程分支
//这句命令会执行两个操作,首先拉取远端文件,然后尝试跟本地文件合并
git pull <远程主机名> <远程分支名>
如果成功,长这样:
如果失败,长这样:
你需要解决冲突,然后提交,再推送
你需要和一起开发的小伙伴确认应该保留哪部分代码,然后删除与之冲突的
接下来把Merge add并提交,然后就可以push了(当然,理论上来说,在你解决冲突的期间,会不会远端仓库的文件又更新了呢?有可能的吧?所以也许需要再pull一次,看你具体需要了)
git push <远程主机名> <本地分支名>:<远程分支名>
回溯历史
查看当前工作区与上次commit/add的差异
//会详细列出当前工作区未暂存的修改内容
git diff
//会详细列出当前工作区中指定文件未暂存的修改内容
git diff 文件名
//会详细列出当前工作区中指定文件未暂存的修改内容与某个指定版本的不同
git diff 版本号 文件名
增加的行,会以
+xxx
的形式标注删去的行,会以
-xxx
的形式标注修改的行,会以
-原来的内容
+现在的内容
标注
//上文提到过,可以总览有哪些文件发生了修改
git status
//嫌输出的信息太多,也可以简略输出
git status -s
修改过的文件,会以
M
作为前缀删除的文件,会以
D
作为前缀新增的文件,会以
?
作为前缀
还没有commit,修改的内容不想要了,想回退到上一次add/commit的状态
- 如果已经add
//必须先reset,否则无法checkout
git reset
git checkout xxx
- 如果还没add
//没有add的情况下,不需要reset
git checkout xxx
已经commit,修改的内容不想要了,想回退到上一次add/commit的状态
//回退到上一个版本
git reset hard HEAD^
//回退到上N个版本
git reset hard HEAD~n
//回退到上指定版本
git reset --hard commit_id
//可以结合log命令,查看以往的提交,n表示查看最近n次提交记录,不设置的话将展示所有历史记录
git log -n
分支管理
查看所有分支
git branch -a
新建一个分支
//你可以选择
git checkout -b xxx
//或者
git branch xxx
区别在于,前者只创建分支,后者还会帮你切换过去
在某个特定commit的基础上新建一个分支
会有这么一种场景,我想新建一个分支,但是当前版本包含了一些新分支不需要的变更,而前n个版本有适合用于新建分支的commit,那么,我们可以在那个commit的基础上去新建分支。例如:
于是乎,我通过翻找log,找到一个合适的版本,id为:ae081072xxx(不需要完整的id,有前几位即可,当然也不能太短)
//你可以选择
git checkout -b xxx commitId
//或者
git branch xxx commitId
//commitId即代表你指定的版本对应的commit
再看看项目目录
切换分支
git checkout 分支名称
切换分支前,需要提交当前工作区的变更,否则将会报错
删除分支
删除需谨慎
——《不要问我为什么说这个话》
git branch -d 分支名称
合并分支
//将指定分支合并到当前分支来
git merge 分支名
如果像我这样遇到冲突
- 1.可以手动解决(前文有提及)
- 2.如果是某些文件单纯的只使用某个分支的就行(比如A文件,想完全采用dev1分支的版本),可以使用命令
//ours表示采用当前分支版本
git checkout --ours 文件名
//theirs表示采用合并过来的分支版本
git checkout --theirs 文件名
需要注意,如果用的是rebase,那么ours跟theirs的意思相反(rebase的用法还没吃透,这里不演示)
最后,提交即可
其他
//清空屏幕
reset
总结
本篇结合git的常用场景,介绍了git的部分命令,git的功能绝不仅限于此,更多的内容有待我们去挖掘,目前我也只是用到了这些,以后随着遇到的场景和问题的增加,我会陆续将更多的内容分享上来
未完待续