前言
我先是看廖老师的git教程学习的git,小伙伴们可以直接百度廖老师的教程。
这里自己总结一下,可以当作教程,也供自己查阅使用。
1.安装
linux下安装十分方便,直接sudo apt-get install git
就可以了。
Windows可以上git官网下载。然后右键或开始里会有git bash
。
由于我之前先安了bash,所以在bash里直接安的git。这和官网下的比有一个好处,就是git是中文的提示hhh,这不重要。
安装完后需要最后一步设置:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
--global
用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
2.创建
在命令行进入需要创建git仓库的文件,
git init
git仓库就创建好了,这时文件夹中多了一个.git文件夹。注意不要修改这个文件夹中的内容。
添加文件到仓库需要两个步骤,先add到暂存区,
git add 文件名 //添加某个文件到暂存区。多个文件用空格分开
git add . //添加所有文件到暂存区。
再commit到本地仓库。
git commit -m "这里写注释" //注释很重要,提交暂存区的所有内容
git commit 文件1 文件2 ... -m "注释" //只提交暂存区的某些文件
3.工作区与暂存区
上面说到了暂存区,这里简单介绍一下:
* 工作区就是我们文件夹下的内容,我们正在工作修改的地方就是工作区。(除了.git文件夹)
* 暂存区就是add操作后的区域,简单理解暂存区的作用就是,将需要提交的文件修改通通add放到暂存区,然后,一次性的commit提交暂存区的所有修改。
4.修改
修改一下文件中的内容,运行
git status
可以查看哪些文件被修改了。具体的修改内容,可以使用下面命令查看。
git diff 文件名
git diff HEAD //显示工作区与当前分支最新commit之间的差异
然后就可以通过add、commit提交到本地仓库了。提交后再status查看,可以发现没有新的修改。
5.版本回退
这个功能是git最好用的功能之一。完全就是后悔药啊。使用
git log
git log --stat//显示commit历史,以及每次commit发生变更的文件
可以查看之前的提交。(提示,按q取消查看,或者ctrl+z也行..)
要是觉得太乱了,可以试试
git log --pretty=oneline
我们使用如下命令回退版本(我们一般用HEAD表示当前版本)
git reset --hard HEAD^ //回退前一个版本
git reset --hard HEAD^^ //回退前两个版本
……
这样可以,就是要回退很久远的版本还要数数,写很多个^。所以我们经常使用下面这个
git reset --hard 15aefa52
后面这个类似乱码的就是之前log时候看到的对应版本的版本号,不用全复制,随手复制前6、7、8、9位就可以。
然后你就会发现,代码都恢复到之前的版本了。
当然如果再想恢复到之后的版本,log里是没有了,使用下面这个可以查到。
git reflog
6.撤销修改
如果想要撤销工作区的修改,可以执行
git checkout -- 文件名
这样就变为上一次提交时候的状态,上一次提交之后的修改被撤销了。
如果想要撤销add到暂存区的修改,可以执行
git reset HEAD 文件名
这样add到暂存区的修改回到了add之前的状态,工作区还存在修改,如果想继续撤销工作区的修改,执行上一条命令。
如果想撤销commit到本地仓库的修改,请使用版本回退。
7.删除文件
如果你删除了工作区的某个文件,可以执行
git rm 文件名
将这次删除操作添加到暂存区,然后commit提交。
如果误删了工作区的某个文件,可以使用上面撤销修改来恢复。
8.远程仓库
自行注册一个github帐号,然后按照下面命令设置SSH。
先查看自己之前有没有创建过ssh key。在用户主目录下,.ssh文件夹中,查看是否有
id_rsa
和id_rsa.pub
。没有执行1,有执行2。创建SSH Key。执行下面命令
ssh-keygen -t rsa -C "youremail@example.com"
在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
将公钥添加到github的设置中。
9.推送到远程仓库
在github上手动new一个仓库(repository),填写一下仓库名称,比如叫test
。
然后我们可以根据github的提示将本地仓库与远程仓库关联
git remote add origin git@github.com:你的github名/test.git
origin是远程库的名字,一般都这样叫,不会有人修改。
然后把本地库推送到远程库中
git push -u origin master
由于是第一次推送,所以加上了-u参数。Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
以后再提交就不用-u参数了。
git push origin master
10.从远程库克隆
如果想克隆别人的远程仓库,或让别人克隆自己的远程仓库,只需执行:
git clone git@github.com:用户名/仓库名.git
11.本地分支管理
前面已经接触过git主分支,即master分支。也接触过HEAD,HEAD其实是一个指针,指向了master分支。
我们可以用
git branch
查看当前分支,当前所在分支前面会标*号。
创建一个分支
git branch dev
这样我们就创建了一个分支,然后使用下面命令切换到这个分支
git checkout dev
当然我们可以使用下面的命令,直接创建并切换到新分支
git checkout -b dev
然后修改文件,add,commit提交到dev分支。
然后我们git checkout master
切回master分支后,会发现新的修改不见了,因为刚刚是在dev分支,master并没有改变。
可以使用下面命令将dev分支合并到master分支上
git merge dev
git merge
命令用于合并指定分支到当前分支
然后我们就可以删除dev分支了:
git branch -d dev
12.解决冲突
这里是最不想碰到的,但是又不可避免。
git会提醒我们某某文件needs merge。
我们可以执行
git merge 文件名
然后一般要手动解决冲突。打开该文件,找到文件中如下区域
<<<<<<< HEAD
一个版本的代码..
=======
另一个版本的代码..
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。我们把这部分改成最后想要的代码,把这些特色符合都删掉保存即可。
然后就可以通过add、commit了。
使用
git log --graph
可以查看分支合并图。
13.分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。这样使用git log查看会与没有no-ff的情况不同,这里会有一个merge记录。如果没有no-ff且没有冲突的话,是没有merge记录的。
14.远程分支
查看远程分支,使用
git branch -r //列出所有远程分支
git branch -a //列出所有本地分支和远程分支
git push origin local_branch:remote_branch //将本地分支推送到远程,如果远程不存在该分支则自动创建。
git push origin remote_branch //上传本地指定分支到远程仓库
git push origin --all //推送所有分支到远程仓库
删除远程分支
git push origin :remote_branch
git push origin --delete remote_branch
15.stash
使用
git stash
可以把现在的工作储存起来,再使用status查看时,可以发现工作区是干净的。这主要用于工作到一半时,有另一个紧急任务需要做,可以先把工作储存起来,紧急任务完成后,再恢复继续。
使用
git stash list
查看stash存的内容。
恢复可以有两个方法,方法一
git stash apply //恢复,但不删除stash记录
git stash drop //删除stash记录
方法二
git stash pop //恢复并删除stash list中的内容
多次stash储存了多个list,可以使用apply恢复指定的stash。
git stash apply stash@{0}
git stash pop stash@{0}
清空stash记录
git stash clear
标签
// 列出所有tag
git tag
// 新建一个tag在当前commit
git tag 标签名称
// 新建一个tag在指定commit,先log找到commitId
git tag 标签名 commitId
// 删除本地tag
git tag -d 标签名
// 删除远程tag
git push origin :refs/tags/标签名
// 查看tag信息
git show 标签名
// 提交指定tag
git push origin 标签名
// 提交所有tag
git push origin --tags
// 新建一个分支,指向某个tag
git checkout -b 分支名 标签名
remote
git remote //列出所有远程主机
git remote -v //查看远程主机的网址
fetch
git fetch //将远程主机的更新全部取回本地
git fetch origin master //从远程的origin的master主分支下载最新的版本到origin/master分支上
//比较本地的master分支和origin/master分支的差别
git log -p master..origin/master
//最后进行合并
git merge origin/master
git pull其实相当于上面全部内容。
rebase
git rebase用于把一个分支的修改合并到当前分支
留个坑,以后补上。可以先查看这篇文章。
http://blog.youkuaiyun.com/wh_19910525/article/details/7554489