git常用命令操作

 git基本操作与规范流程

git是个非常好用的版本工具,不但可以在linux下环境使用,还可以在windows下使用。我们的整个代码工程需要使用这个来管理,我们自己的一些联系也可以很方便的使用它去管理,节省了很多代码维护的成本。

 一、基本应用

1.安装

git的安装

windows下:也有相应的安装文件,http://code.google.com/p/msysgit/downloads/list在这个目录下可以下载到,一般推荐安装这个list里面的第一。

mac xcode自带git  git安装  http://git-scm.com/download/  

gitconfig配置  .gitconfig 

gitignore配置  https://github.com/github/gitignore 

git有一些全局的设置和变量,我们可以通过gitconfig

-l去查看这些参数,git在提交修改的时候会记录提交者的姓名和email,这样便于代码的整体管理,安装后我们需要设置一下,

我们的一些相关参数,具体设置的命令可以用git config --global user.name "XXXX"去设置全局的作者名和gitconfig

--global user.email "XXX"去设置全局的email地址。

设置后,我们在查看每次的修改时,都会显示出这次修改掉作者是谁以及他的mail地址。


想了解具体git命令的使用和说明,我们可以使用git XXX --help命令去显示相应命令的说明文档。

2.建立代码库

使用命令:git init

在当前目录中运行以完成初始化,随后可以使用git status去查看当前代码库的状态。

这个时候,我们可以看到,我们在自己工程中的,1.txt和.gitignore这二个文件,提示我们他们是untrack的。

.gitignore中添加了它,所以这个文件将会被git

ignore掉,这样方便我们的工作,因为我们在工作中,可能会有很多的*.tmp文件以及*.obj这些临时的,我们不关心的文件,所以我们通过.gitignore这个文件去简化我们需要关注的文件.gitignore这个文件里面的文件只要写相对路径就可以,每一行代表一个需要忽视的文件,文件类型或者是目录。

3.管理改动

a.查看当前状态

使用命令:git status

这个命令可以查看当前的状态:

untrack files是指尚未被git所管理的文件;

.gitignore中的文件,不会出现在以上状态。(gitignore 起作用的文件是在远程没有的文件)

 b.向stage添加文件

使用命令:git add

git add [path]会把对应目录或文件,添加到stage状态

git add . 会把当前所有的untrack files和changed

butnot updated添加到stage状态

 c.从stage移除文件  (非常用)

使用命令:git reset

这个命令与add相反,但它还有其他功能,后文介绍。

git reset [path]会改变path指定的文件或目录的stage状态,到非stage状态

git reset 会将所有stage的文件状态,都改变成非stage状态

d.删除文件

使用命令:git rm [path]

这个命令用来删除文件,可以用git status查看git rm与普通rm的差别。git rm后的文件,都在stage状态。

e.查看差异

使用命令:git diff

git diff 可以查看当前不在stage状态的改动,加参数--cached可以查看stage状态的差异,还可以指定文件名

如git diff --cached 1.txt 可以查看stage状态的1.txt的差异

注意stage状态的diff(即--cached)是stage与HEAD的差异,非stage状态的diff是与stage状态的差异。

一个文件可以存在非stage和stage两个状态,可以通过git add和git reset合并。

合并的结果都是非stage的状态,因为这个是在stage基础上修改的。

f.回退改动

使用命令:git checkout [path]

git checkout 有很多用处,这里用到的是checkout文件,一些版本管理软件提供有revert命令,可以revert某个文件上的改动。

其实这个通过checkout这个文件的最新版本就可以完成。

如果做的一些修改不需要了,用git checkout [path]就能把这个文件还原,同时也能从stage和非stage状态中去掉这个文件,就如同没有修改过一样。

4.提交改动

使用命令:git commit

git commit -m "XXXX"直接为这次修改提交注释。推荐使用。需要强调的是,这里的提交,都是基于本地完成。

git commit -am “”

5.已提交改动管理

a.查看历史记录

使用命令:git log

使用这个命令,我们可以看到所有当前分支的commit。

使用这个命令后,出现的commit XXXXXXX,后面这个编码是每个commit的唯一编码,我们需要查看某一个commit,只要打出这个commit的前四位就可以了。

查看历史记录也可以使用gitk,更为方便。

b.查看版本差异

使用命令:git diff

git diff可以用来查看版本之间的差异,命令格式为gitdiff

[version1]..[version2],如git diff HEAD^..HEAD~2

c.回退已提交改动

使用命令:git reset

git reset的另一作用是回退改动,记法是gitreset

[version],一般用HEAD表示最新的change log。那么,回退1个change的写法就是git reset HEAD^,2个为HEAD^^,3个为HEAD~3,以此类推。

git reset 有几个选项:

如果什么都不加,比如git reset HEAD^,会把改动回退到unstage状态,改动不会丢失。

如果加--soft,改动会回退到stage状态。

如果加--hard,改动会直接丢失。使用时千万小心!!

d.有记录的回退

使用命令:git revert

git revert的回退方式与reset不一样,它会提交与回退改动相反的改动,来与之抵消。也就是和reset起到同样效果的同时,还留下痕迹。但一般只能用来处理最新一个change的回退。

一般调用方式为git revert HEAD。

7.标签

tag是很有用的一项功能,简单来说,tag就是某个change的一个别名。要发布版本,标记里程碑等,都用tag来做。另外比如像android这样的项目,有多个git库,用同样的tag来统一标记每个库上的某个版本,也为版本的checkout带来了很大的方便。

基本命令:git tag

git tag [tag_name] [version],在对应版本上(一般用change的SHA1),创建tag

git tag -l 列出当前tag

git tag -d [tag_name] 删除tag

有了tag以后,可以使用git checkout [tag_name] -b [branch_name]来检出对应tag时刻的代码。也可以用tagname来实现diff等功能。

二、分支

使用分支的意义,如果你目前的代码需要做一些实验或者是一些不确定的修改,但是你又不想做过测试后,再把代码该回到原始状态或者是影响这个稳定的版本,这个时候我们就要使用branch。

同时使用分支,也能方便同时维护很多不同模块的开发进程,保证他们的开发尽量不互相影响。这是很好的习惯。

1.分支的建立:

使用命令:git branch [branch_name]

这个命令会基于当前branch的状态创建另一个branch。git的branch是很轻量级的,新分支的创建就是一个版本的标记而已,无须复制文件。

使用命令:git checkout

git checkout 可以基于分支,tag,或change,创建出对应的分支。这种方式更加灵活。命令格式为git checkout [branch/tag/change] -b [branch_name]。

2.分支的查看:

使用命令:git branch

使用这个命令,可以看到目前存在的所有本地分支,并且可以看到目前工作在那个目录上。

3.分支的切换:

使用命令:git checkout[branch_name]

此命令可以切换分支,注意所有的stage和unstage状态都会被切一起切换,注意先用stash保存。

4.分支的合并:

这个操作是比较容易引起问题的,请尽量保证本地worktree比较干净再来做这一操作。有如下操作方式

a.整个分支合并

使用命令:git merge [branch_name]

使用这个命令来将branch_name指定的branch上的改动,合并到当前所在的branch。合并的轨迹可以在gitk中明显的看到。

合并两个分支,最容易产生的问题就是代码的冲突。git会提示冲突的文件,可以使用git status查看,提示unmerged。

用熟悉的编辑工具打开有冲突的文件,可以看到由<<<<<<<和======中间的,是目前所在branch的修改。========和>>>>>>>之间的,是要合并的修改。选择自己需要的部分,并移除<=>等符号,保存。

随后可以使用git add添加到stage状态,并提交即可。这样的提交因为有merge的动作在前,与普通提交是不同的,从gitk上可以看出有两条线的merge。

另外一点需要注意的是,即使不修改<=>中间的内容,也可以git add到stage,git会认为你已经merge好了。所以请一定记得首先做好所有conflict的处理!

另外一个冲突的解决方法是执行git mergetool,可以使用比如kdiff3等3路merge工具来完成merge,喜欢用图形工具的会方便一些。

b.合并单独的change

使用命令:git cherry-pick [change's SHA1]

git cherry-pick可以手工选择一些改动来集成到当前分支,是最灵活的方式。使用change的SHA1前4位即可。遇到冲突,和merge的解决方法一样。需要注意的是cherry-pick并不带来分支轨迹的变化。

5.分支的删除:

使用命令:git branch -d/-D

-d是删除已经合并过的branch,-D是直接删除

三、多人协作

git是分布式的版本控制工具,每个人都可以有自己的版本库,本地也可以存储完整的版本信息。多人协作的方式方法也有很多。这里主要介绍一些基本的操作,后面也会有一些具体的协作流程来规范一下多人协作的模式。

1.clone版本库

使用命令:git clone [path]

git是分布式,所以如果不是新建库的话,就需要首先在本地将服务器上的版本库下载回来。git clone可以下载path指向的http://和git://协议的地址,也可以是本地文件夹。clone下来的库,包含了完整的版本和分支等信息。

git clone下来以后,使用git branch -r可以查看远程分支。一般是远程名/分支名的形式。远程分支一般只在更新时候用,或者作为merge的源,一般不要直接switch过去,更不要去更改。

2.配置个人信息

使用命令:git config

使用git config可以配置选项。个人信息也是在这里完成。加--global选项会对本用户名下所有的git库都采用全局配置。

姓名:git config --global user.name xxx

邮件:git config --global user.email xxx

3.更新代码

a.同步最新代码

使用命令:git fetch

git fetch的作用是更新远程分支的信息为最新,但并不会影响本地分支的状态,一般也不会带来什么问题。由于git是分布式的,所以fetch后,所有的远程库的内容,都拷贝到了本地。后面的集成代码过程中提到远程,其实都是指本地的远程拷贝而已,并不是远程了。

b.集成最新代码

集成代码的工作,往往跟merge有关,所以也需要保证worktree尽量的干净。以免带来问题或增加复杂度。

1)配置branch的trackingbranch

tracking branch指定从哪里集成代码,后文也会提到这个配置也被用作提交代码的目的地

方法1: 在创建branch的时候指定,利用--track参数

比如git branch --tracking [local_branch_name] [full_remote_branch_name]

方法2: 手工指定或修改

git config branch.[branch_name].remote =origin

(一般默认远程库代号都是origin)

git config branch.[branch_name].merge

=refs/heads/[branch_name] (指定远程库的引用)

配置好tracking branch后,pull,push都不用加参数了。否则需要为他们加路径参数。

2)git pull

git pull等同于git fetch +

gitmerge,merge的是当前所在branch所指定merge branch。如果出现冲突,用前面介绍过的方法解决。如果手工拆开使用git fetch, 之后再git merge,是需要为merge指定源branch的。

(一般用git pull --rebase)

3)git rebase [branch_name]

git rebase的作用,是改变一个分支上的某些change的位置,一般是提升到新的基线版本,新版本由branch_name指定的branch的HEAD确定。比如基于linux2.6.26做了一些驱动,那么,当要把这些驱动的改动,放到2.6.28版本上去的时候,就可以用git rebase 2.6.28这样的命令来完成。

如有冲突,同样的方法去解决好后,执行git rebase --continue继续,或git rebase --abort退出,或git rebase --skip跳过当前冲突。成功的话,就能把当前自己基于老版本的修改,变成基于最新版本的。

执行命令时,git rebase的参数,源branch name不由tracking branch配置决定,需要手工指定。

这里比较一下pull和rebase的差别。因为后面讲到push,也就是提交改动的时候,这些操作的结果会影响到远程库的分支状态。

他们两者其实都能把最新的远程代码与本地代码合并。

但前者主要的操作是merge,有可能提交一个merge change log的,也会在历史中留下分支合并的信息(gitk可以看到分叉和合并)。

而后者rebase,更大程度上能保证历史是线性的。

所以,一般情况下推荐用rebase来做合并,这样也更符合传统版本控制软件的流程。

而merge更适合用在一些需要体现出,或者强调分支的地方,比如一个较复杂,较长期的功能开发分支,合入到主分支的时候。

协调好这两种方式,对保证远程库分支的整洁是有重要意义的。

4.提交代码

使用命令:git push

配置好tracking branch之后,将本地分支的代码,提交到远程库,只要输入git push即可。但运行这个命令前,一定要首先保证已经merge或rebase过,否则是不会成功的。

默认push.default选项,是将本地所有和服务器上匹配的branch的改动,都push上去。一般我们需要设置git config push.default tracking,只推送当前branch到它所tracking的branch。

以上是一些比较精简的git操作流程。供大家熟悉基本的git操作。git是大而复杂的系统,同样的事情有很多方法可以完成。

常用命令

git clone qtpay:android_v2.git android_v2  克隆分支

git pull    (git fetch)更新分支代码

git add . :把工作区的修改写入到暂存区的一个新对象

git commit -m "xx": 把暂存区的待提交对象提交

git push      提交远程

git branch aaa   创建分支aaa

git checkout aaa   切换到分支aaa

git checkout -b aaa  创建并切换到分支aaa

git merge origin/xxx   合并远程分支到当前分支

git log  查看log数据

git ckeckout log_xxx  切换到log中历史版本


参考

http://blog.csdn.net/cailiwei712/article/details/7469018   

http://www.tuicool.com/articles/bayaqa

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容