git usage guide

Git使用指南

基本配置

开始使用git之前一般需要配置两个项目,操作命令如下:

git config --global user.name "Dylan Deng"
git config --global user.email "dengxingxian@tianyisc.com"

分别把两行命令中引号里的内容改成你自己的名字和邮箱。

一些使用案例

git checkout -b neimengv1.0 neimengv1.0  # 取得tag`neimengv1.0`的内容并创建为本地分支neimengv1.0
git checkout -b master origin/master     # 取得master分支的内容并创建为本地分支master
git fetch origin refs/changes/34/34/1 && git checkout -b change-34 refs/changes/34/34/1 # 取得编号为34的改动的内容并创建为本地分支change-34
git push origin HEAD:refs/for/common     # 上传当前提交到代码审阅,审阅通过会合并到common分支

初始化仓库

获得远程仓库

git clone <repository_url> [-b <branch_name>] [directory]

repository_url为远程仓库地址,为必须参数。 -b 此选项为可选参数,如果不提供这个参数,下载完成之后默认检出master分支。 directory 为可选参数,如果不提供这个参数,git会根据url,在当前路径创建一个与仓库同名文件夹,然后将仓库克隆到此文件夹。 example:

git clone ssh://dylan@192.168.99.89:29418/aml_02 -b common aml_02

初始化本地仓库

如果远程仓库不存在或者远程仓库存在但是为空的,我们需要在本地创建一个git仓库然后上传到远程。操作过程如下:

cd $worktree                     # 进入到目标工作目录
git init                         # 初始化仓库
git add filename1 filename2      # 添加需要使用版本控制来追踪的文件
git commit -m "initial commit"   # 第一个commit
git remote add origin <repository_url>   # 和远程仓库关联
git push origin HEAD:refs/heads/mater    # 上传本地commit到远程

开始开发

查看修改

查看修改过的文件:

git status

查看具体修改:

git diff

查看指定文件的修改:

git diff -- filename1

添加文件

git add filename1 filename2 filename3

提交

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
	   [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
	   [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
	   [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
	   [--date=<date>] [--cleanup=<mode>] [--[no-]status]
	   [-i | -o] [-S[<keyid>]] [--] [<file>…​]

只提交指定的文件

git commit -- filename1 filename2 filename3

refer Git - git-commit Documentation.

上传提交

git push <remote> [local_branch:]<remote_branch>

如果remote未指定,则默认为origin;如果local_branch未指定,则默认为HEAD,即当前最新提交;如果remote_branch未指定则默认为当前分支。 example:

git push origin HEAD:master

上传到代码审阅

git push origin HEAD:refs/for/<branch>     # <branch>替换成要上传的分支

更多用法参考Git - git-push Documentation

获取别人提交

获取修改:

git fetch [<options>] [<repository> [<refspec>…​]]

通常写作git fetch,即获取仓库origin的所有分支修改。

获取修改并更新工作空间:

git pull [<repository> [<refspec>…​]]

git pull实际等于git fetch + git rebase 或 git fetch + git merge,也就是说,更新工作空间实际由git merge或git rebase完成,具体取决于你的git 配置。相关配置项:pull.rebase,如果pull.rebase=true,将会采用rebase策略来更新工作空间,否则使用merge策略更新工作空间。推荐rebase策略,因为merge策略一般会生成一个类似_Merge branch ‘common’ of 172.16.8.220:aml02 into common_的提交,这个提交不包含有用信息,是多余的。

git pull必须在当前分支有upstream,并且工作空间干净时候才可以执行。如果当前不处于分支上,使用git fetch origin; git rebase origin/<branch>来更新工作空间。如果工作空间不干净,可以先执行git stash save来暂存更改,然后执行git pull,然后执行git stash pop来恢复之前的更改。

更多用法参考:

查看修改记录

查看修改记录的命令为git log,通常有以下几种用法:

git log --all --graph --decorate
  • –all 查看所有分支修改(默认为当前分支)
  • –graph 以图形形式展示分支历史
  • –decorate 加上此选项,分支名会在log中显示

其他常用参数

  • -p 显示每个提交的具体修改
  • -n n为数字,指定要查看的log条数
  • –oneline 每个提交压缩为一行展示
  • [– path] 查看指定文件或路径的修改记录,eg: git log -- filename1
  • –stat 统计每个提交修改过的文件

分支

创建一个新分支:

git branch <new_branch>

切换一个分支:

git checkout <branch_name>

从指定提交创建一个分支并切换到这个分支:

git checkout -b <branch_name> <refspec>

删除一个分支:

git branch -d <branch_name>

强制删除一个分支:

git branch -D <branch_name>

上传一个分支到远程仓库: example:

git push origin branch_name:branch_name

删除一个远程仓库分支: example:

git push origin :branch_name

git-merge

git merge的效果一般像这样:

  A---B---C topic                        A---B---C topic
 /                      ------------>   /         \
D---E---F---G master                   D---E---F---G---H master

git-rebase

rebase之前:

          A---B---C topic
         /
    D---E---F---G master

执行git rebase master topic之后


                  A'--B'--C' topic
                 /
    D---E---F---G master

git-revert

git revert会通过生成一个新的提交的方式来撤销指定的之前的提交。

git-reset

git reset可用于设置HEAD指针位置或者恢复文件,重写历史等。

git-stash

应用场景:当前工作空间有更改,需要获取别人的修改并更新工作空间,当前工作空间修改不适宜提交。 暂存修改:

git stash save

查看stash列表:

git stash list

将暂存的修改恢复到工作空间并丢弃这个暂存:

git stash pop

相关配置项 rebase.autoStash

常用配置项

  • core.editor string值为可以为vim,nano,gedit等,会影响commit时候编辑COMMIT_MSG的编辑器等
  • core.autocrlf input,auto,false,commit时候对文本文件换行符的处理
  • user.name string用户名
  • user.email string用户邮箱
  • pull.rebase bool执行git pull时候更新工作空间的策略
  • rebase.autoStash bool执行rebase时候是否自动暂存未保存的更改
  • http.proxy http代理
  • user.signingKey 指定用于commit和tag签名的gpg私钥
  • commit.gpgSign bool是否在commit自动签名

git revision

某一个提交:

  • HEAD 当前位置
  • FETCH_HEAD 从服务器上获取到的指定的位置
  • <branch> 分支
  • refs/changes/30/30/5或refs/heads/master这样的形式
  • 某一提交的commit id

某些时候需要输入revision range,格式为<revison1>..<revision2>,例:origin/common..HEAD 使用案例:

  1. git diff origin/master..master 比较服务器版本master分支和本地master分支差异
  2. git log 9697889b0b58029debdd8a8310f1ce863bfd7dcd..f6502daaf3008a7cfe1d8a52cb698e1557de812d 查看指定两个提交之间的修改日志

更多

Please refer git-doc.

 Share!

 
comments powered by Disqus