您的位置:首页 > 其它

git常用命令介绍

2016-04-08 17:11 393 查看
git学习: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

因为工作中的项目都是通过git来做代码管理,所以对于git要学习一下。

(1)git是目前最先进的分布式版本控制系统。

(2)git的历史发展linux的开发者Linus前期不希望使用CVS,SVN等软件来做linux的版本管理,后来使用的商业软件Bitkeeper,但是后来由于某些人威胁到了bitkeeper,linus两周时间通过c语言写了一个代码管理工具,就是git。2008年github上线之后,大批的开源项目开始迁移到git上面来。

(3)SVN,CVS都是集中式的版本控制管理工具,意思就是有一个中央服务器,所有的代码都是在中央服务器上面。而git是分布式的,意思是每个人本地都有有一个管理库,即使不联网的状态下也可以进行代码提交等。对于修改后的内容可以Push到远程某一个代码仓库。远程的代码仓库可以是另外一个人的代码仓库或者是类似于公司这种设置的“中央服务器”上面。

(4)msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。然后可以通过命令:
$ git config --global user.name
"Your Name"
$ git config --global user.email
"email@example.com"
来设置仓库的用户名和邮箱。
global的意思是所有的仓库都使用这一个配置。也可以为不同的仓库配置不同的用户名和邮箱。

(5)创建版本库
版本库又叫做仓库,repository。创建版本库其实就是告诉git这个里面的所有内容可以通过git来管理了。
$ mkdir learngit
$ cd learngit
$ git init
(6)为仓库添加第一个文件
通过Notepad++这种先进的编辑器编辑一个a.txt文档。该文档要放在git仓库目录下面。
git add readme.txt
git commit -m
"wrote a readme file"
分成add和commit是因为可以多次add,一次性commit。

(7)查看当前仓库状态
$ git status 通过该命令可以查看到仓库中现在存在的改动内容。
$ git diff readme.txt 可以查看文件的修改内容
$ git log 查看提交历史
$ git log --pretty=oneline 显示提交历史更加pretty,更加简介,一行就ok
$ git reset --hard HEAD^ 回退到之前的版本 HEAD~N N代表回退的版本数
$ git rest --hard commitid 通过commitid回退到某一个版本
$ git reflog 查看所有的git命令执行记录

(8)工作区和暂存区
工作区就是我们自己创建的文件夹,可以在里面创建修改文件等。里面有个隐藏文件夹叫做.git,在该文件夹下面有缓存器stage和分支信息(系统默认创建的分支叫作master,指向master的指针叫作head)。
调用git add命令之后,其实是先把要修改的内容提交到了缓存区,然后调用commit命令的时候就是把缓存区的内容提交到了当前的分支上面。
如果修改内容之后不去add,那么在commit的时候也是不会提交这些改变的。



(9)管理自己的修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

(10)删除一个文件
$ git rm test.txt
$ git commit -m
"remove test.txt"
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

(11)远程仓库
可以再github上面申请一个账号,然后在本地配置公钥并且添加到github网站上面。
$ ssh-keygen -t rsa -C"youremail@example.com"

(12)添加远程仓库
如果在github上面创建了一个空的仓库,github提供两种方式,一种是从远程上面clone该工程,一种方式是把本地的仓库和远程的仓库进行关联,然后把本地的仓库内容推送到远程上面。
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
【在本地仓库中运行这个命令 意思就是将远程的origin下面的repo_name.git关联到本地的仓库】
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
【推送到远程仓库的master分支上面】
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

(13)Clone某一个仓库
$ git clone git@github.com:michaelliao/gitskills.git

(14)分支的概念
创建dev分支,然后切换到dev分支:
$ git checkout -b dev
上面的命令等于一下两条命令的作用:
$ git branch dev
$ git checkout dev
查看当前分支:
$ git branch
在列出的内容中,前面带有*号的就是当前分支。
$ git check 分支名称 切换分支
现在,我们把dev分支的工作成果合并到master分支上:
$ git merge dev 把dev分支合并到当前分支
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev

(15)解决冲突
当两个分支上面的内容存在冲突的时候,如何解决?比如在master分支和dev分支上面都对文件test.txt进行了修改,在合并分支的时候就会存在很大的问题。
当merge的时候会出现文件冲突的错误,可以手动解决冲突,然后再次提交。
$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|\
| * 75a857c
AND simple
* | 400b400 & simple
|/
* fec145a branch test
查看分支合并的图。

(16)分支管理策略
在分支合并时默认采用的模式是:Fast forward方式,这种方式,在删除分支之后,会丢失分支信息。
$ git merge --no-ff -m
"merge with no-ff" dev
加上参数 --no-ff就可以取消默认的合并模式
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:



Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

(17)Bug分支
比如当前我们正在dev分支上工作,现在说master分支的那个版本上面有错误,怎么办?首先可以先把当前工作进行存储。
$ git stash
首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
$ git checkout master
Switched to branch
'master'Your branch is ahead of
'origin/master' by 6 commits.
$ git checkout -b issue-101
首先切换到master,然后在此基础上创建issue-101分支。
在issue-101上面完成内容修改后,切换到master分支,然后合并issue-101分支内容。
$ git checkout master
Switched to branch
'master'Your branch is ahead of
'origin/master' by 2 commits.
$ git merge --no-ff -m
"merged bug fix 101" issue-101Merge made by the
'recursive' strategy.
readme.txt | 2 +-
1 file changed,
1 insertion(+), 1 deletion(-)
$ git branch -d issue-101Deleted branch issue-101 (was cc17032).
此时我想恢复到原来dev分支上面的工作,先checkout到dev分支,然后通过git stash list查看存储内容。
$ git stash list
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash pop
小结
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

(18)Feature分支
对于新的功能,都可以新建一个分支,然后在分支上面开发新的功能,开发完成之后,合并到原来的分支就可以了。但是在没合并之前,要抛弃新的功能,那么只需要删除分支就可以了。对于还没合并的分支,在删除的时候要加上一些参数。
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

(19)多人协作
多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结

查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

(20)如何贡献开源项目
在github上面有很多开源的项目,如果想为开源项目做贡献,

在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。

插播一条广告:欢迎下载使用随缘吧app, http://www.suiyuan521.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: