Contents
×
Git命令备忘录
  •  
    1 本地项目git管理
    •  
      1.1 介绍自己及环境配置
    •  
      1.2 建git仓库
    •  
      1.3 显示状态
    •  
      1.4 提交修改
      •  
        1.4.1 提交跟踪文件的全部修改
      •  
        1.4.2 全部文件添加再提交
      •  
        1.4.3 交互式添加再提交
    •  
      1.5 查看LOG
      •  
        1.5.1 常用命令
      •  
        1.5.2 将复杂命令做成别名举例
    •  
      1.6 分支
      •  
        1.6.1 基本分支操作
      •  
        1.6.2 rebase操作
  •  
    2 协作方式一:本地目录仓库
  •  
    3 协作方式二:远程URL
  •  
    4 svn、git共存管理版本的思路
  •  
    5 vim 查看git diff的插件
  •  
    6 diff的常见用法
  •  
    7 Tutorial
  •  
    8 tag的用法
  •  
    9 .gitignore的作用
  •  
    10 其它

Git命令备忘录

Keywords: git
Original published url: http://www.geiliedu.com/manual/18
Shared: Visits: 1618 Created at: 2016.01.08 Updated at: 2016.02.01 Author: geiliedu(282055808@qq.com)

1 本地项目git管理

1.1 介绍自己及环境配置

git的安装,请自行百度。本文主要适用于linux或者unix的控制台中使用git。在windows中使用git的同学,也可以参考,图形界面的背后命令实质上和本文的描述没有任何区别。顺便提一下,windows中建议安装Git for Windows,然后再安装TortoiseGit。

  • 在自己的电脑上,为git设置用户名,这样在提交日志中会看到是谁提交的,在多人协同的项目中必须设置。
git config --global user.name "your name here"
  • 在自己的电脑上,为git设置email,同样在提交日志中会看到是谁提交的,在多人协同的项目中必须设置。
git config --global user.email you@yourdomain.example.com
  • 提交代码时使用vim为编辑器,如果不设置且commit命令不带参数时,linux中会启动nano编辑器。
git config --global core.editor vim
  • 不希望仅文件修改日期不同就视为已修改,可以设置core.filemode为false
git config --global core.fileMode false
git config --local core.fileMode false
  • 全局配置和项目配置说明:–global选项代表全局配置,可以在任何目录下设置。–local选项代表项目选项,带该选项的git命令要求在项目(有工作文件也有git仓库的项目)的目录或者子目录中执行才有效。

  • 查看配置:

git config -l
git config --global -l
git config --local -l

例如:

$ git config -l
user.name=fengyh
user.email=fengyh@mele.cn
alias.lgb=log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit --date=relative --branches
diff.external=git_diff_wrapper
pager.diff=
color.ui=true
core.filemode=false
core.editor=vim
push.default=matching
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
remote.origin.url=git-hskedu@git.geiliedu.com:~/p_pinyin.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

可以看出:在项目中执行git config -l时,会顺序列出全局配置和项目配置。

$ git config --local -l
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
remote.origin.url=git-hskedu@git.geiliedu.com:~/p_pinyin.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

1.2 建git仓库

  • cd到项目目录,比如gittest
cd <codebase>
  • 假设这个目录有一个文件叫test.c,内容如下图所示:

pic

  • 初始化仓库, 在当前目录下建一隐藏子目录”.git”,每一个操作都可以用git status查看状态。
git init

pic

会发现此时的状态显示为test.c未被跟踪文件。

  • 加入所有文件到仓库
git add .

pic

状态显示test.c为新增文件。

  • 提交代码到本地仓库。
git commit

pic

顶部红框部分是需要输入的本次提交的说明。底部蓝色圆圈:w是vim的存盘命令,:wq是存盘并退出vim,退出后git会提交代码到git仓库。之所以弹出这个编辑界面,一个是因为git commit命令没有带-m选项(-m选项后跟单引号引起的版本提交说明文字),另外是因为我们的环境配置中设置了core.editor为vim。其余信息是git自动产生的,请不要修改

pic

提交后查看状态以及日志,得到如下图信息:

pic

提示

首次提交,因全部文件都是新增,可以不带-a参数

git commit -a也可以。

git commit -m '修改说明'这样不会弹出vim或者nano编辑器

1.3 显示状态

这是用的最多的命令,一般在提交代码时通常都要看一下状态,比如哪些文件是新增,哪些文件是修改过,哪些文件还未加入仓库。

git status

1.4 提交修改

1.4.1 提交跟踪文件的全部修改

对于非常熟悉自己代码情况的,比如本次代码更新没有新文件的增加时,推荐这个方法。

git commit -a

对test.c文件做了修改,添加一行打印信息,然后用gcc test.c命令编译程序,得到a.out可执行文件,此时再查看状态。可看到如下图所显示信息:

pic

提示:a.out不应该提交到git仓库,因为这是编译产生的结果。所以不可使用上述的git add .命令。但是可以使用git commit -a,这个命令不会添加新增文件,只会添加修改过的文件。

pic

1.4.2 全部文件添加再提交

不推荐使用这种方法,因为”git add .”会将没有在.gitignore文件中过滤掉的中间临时文件也一同加入仓库。

git add .
git commit

1.4.3 交互式添加再提交

对于更新较多,小伙伴们急需你提交某些修改,但有不适合全部提交,比如某些文件的更新仍有编译问题要解决等情况,推荐此方法。

  • 交互式添加
git add -i

tips:

显示修改提示、主菜单;

比如选择u, 处理update;

问如何处理update, 比如选择‘*’会添加所有修改文件,并回到上级菜单。也可小范围添加修改文件;

处理完后退出,回到shell状态。也可以再次git add -i更改;

  • 然后提交,注意不带-a选项。
git commit

1.5 查看LOG

1.5.1 常用命令

git log
git log -p
git log --stat --summary

常用选项说明

  • -p: 按补丁格式显示每个更新之间的差异。

  • --stat: 显示每次更新的文件修改统计信息。

  • --shortstat: 只显示 –stat 中最后的行数修改添加移除统计。

  • --name-only: 仅在提交信息后显示已修改的文件清单。

  • --name-status: 显示新增、修改、删除的文件清单。

  • --abbrev-commit: 仅显示SHA-1哈希值的前7个字符,而非所有的40个字符。:可以只用代表版本的SHA-1哈希值的前7个字符引用该版本,例如对照两个版本的差异的命令。

  • --relative-date: 使用较短的相对时间显示(比如,“ 2 weeks ago”)。

  • --graph: 显示 ASCII 图形表示的分支合并历史。

  • --pretty: 使用其他格式显示历史提交信息。可用的选项包括: oneline, short, full, fuller 和 format(后跟指定格式)。

1.5.2 将复杂命令做成别名举例

  • 例如设置lgb别名,别名的名称要求是不存在的命令。
git config --global alias.lgb "log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit --date=relative --branches"
  • 使用别名就像使用git自带命令一样
git lgb
git lgb --stat

如图是git lgb --stat的输出: pic

1.6 分支

新建的仓库只有一个master分支。通常master分支代表稳定版本,其他实验性质的,或者特殊分支项目的代码需要用其他的分支表示。实验性质的分支,验证可用则会合并到master分支,否则做废弃处理。这里我们以experimental分支为例做说明。

1.6.1 基本分支操作

建新分支

git branch experimental

查看分支列表(输出结果中带*号的是当前分支)

git branch

切换到experimental分支

git checkout experimental

提示: 可以“一步完成建分支和切换”:

git checkout -b experimental

修改、提交,切回master分支

  • 做些编辑修改

  • 提交:git commit -a

  • 切换回master: git checkout master

在master上修改、提交 - 做些编辑修改

  • 交互添加文件(选择交互只是示例一种方法):git add -i

  • 只提交部分修改(交互式添加后提交,不带-a): git commit

将其他分支合并到当前分支

  • 将experimental合并到当前分支(当前分支没有提交,则不能合并): git merge experimental

  • 冲突提示:如有冲突则提示。冲突是本分支和experimental的同一个位置同时有修改。避免冲突的方法是,不同的人负责修改不同的文件。如果同时编辑修改同一个文件的同一个函数,往往会有比较频繁的冲突发生,解决方法通常要负责修改的人一起讨论决策如何解决冲突:取其一,或者将冲突部分重组。

  • 查看冲突:git diff

  • 解决后提交:git add <冲突的文件>, git commit

在图形界面中查看历史记录

gitk

说明:gitk要求是桌面版的linux系统。

删除分支

git branch -d experimental
git branch -D experimental

说明: 上述命令-d选项不能删除当前分支,即如果当前分支是experimental,则不能删除。而且experimental没有合并(merge)到其他分支时,用-d选项也不能删除。没有合并强行删除需要使用-D参数(大写)。

1.6.2 rebase操作

将rebase操作单独拿出来说,是因为它不容易理解。我们举例说明。为简明起见,例子中的版本用字母代表,实际情况是40个字符的唯一哈希值代表一个版本。

  • 作用1修改下游分支的分叉点(分叉点的意思是下游分支从上游的哪个commit开叉的)。

pic

git checkout topic
git rebase master (或者git rebase master topic)

说明:原来的topic分支是从E版本分出去的。经上述命令后,master分支不变。master分支中后续的F和G的提交更新到topic,也即rebase之后新的topic分支中的A’版本相当于是在G版本的基础上做了之前A版本的修改。

注意: 执行rebase前,如果上游分支在分叉点之后的某个版本中,包含了下游分支的修改(比如下游版本A的修改,通过制作patch文件,通过email发送给上游分支的开发人员打了补丁),那么那个打补丁的版本(图中的A’)将被。A和A’都做了相同的修改,但是它们有各自的提交信息。

pic

  • 作用2迁移分支,或者说更改上游分支。即将某分支(比如topic)迁移到另外一个上游分支。topic分支所依赖的内容在master中都已经具备且更稳定时,通常用这个方法处理。
git rebase --onto master next topic

pic

说明:上图想把topic分支从上游分支next迁移到更稳定的master分支。

git rebase --onto master topicA topicB

pic

说明:上图将topicB从topicA迁移到master,实质上和之前的将topic从next到master没有本质区别,区别在于master分支在做rebase前是否更新过。这种迁移,在topicB不依赖于topicA时非常有用。

  • 作用3在一个分支中移除某段更新(某几个版本的提交内容),比如放弃某几个提交。

pic

git rebase --onto topicA~5 topicA~3 topicA

说明:上图和上述命令的目的是将F、G这两个更新从分支中移除(放弃这两个更改)。注意需确保H、I、J、的修改不依赖于这两个修改。

2 协作方式一:本地目录仓库

3 协作方式二:远程URL

4 svn、git共存管理版本的思路

5 vim 查看git diff的插件

6 diff的常见用法

7 Tutorial

8 tag的用法

9 .gitignore的作用

10 其它