Git 使用指南

目录

Git 是一个分布式版本控制系统,可以记录文件变化,以便在需要时退回过去某个时间点的状态,它与SVN最大不同在于,GIT是直接快照,而非比较差异,因此它拥有许多令人兴奋的特性,如简便的分支管理、高效率的分布式控制等等。

本文是 《Pro Git》 阅读笔记整理,重点介绍 Git基础使用、Git分支管理、Git分布式工作流程。

一、Git 基础要点

1.1、直接快照非比较差异

Git 只关心文件数据的整体是否发生变化,而SVN关心的是文件内容具体差异。

1.2、三种文件状态

已提交(committed ),已修改(modified )和已暂存( staged )。

1.3、典型工作流程

新文件–已暂存–已提交–已修改–已暂存–已提交 …

二、Git 安装与初始化

2.1、安装方法

bash
apt-get -y install git-core git-gui
yum -y install git git-gui
bash
Mac: http://code.google.com/p/git-osx-installer
Windowns: http://code.google.com/p/msysgit

2.2、git 中文本地化

bash
#获取中文本地化文件
curl -L https://github.com/gotgit/git-po-zh_CN/raw/maint-zh-cn/po/zh_CN.po > zh_CN.po

#将zh_CN.po文件复制到Git源码的po目录
cp zh_CN.po path/to/git/po/

#编译及安装 git,然后就可以让Git说中文了。
cd path/to/git/
make all && sudo make install

2.3、全局配置

  • /etc/gitconfig :系统中对所有用户都适用的配置文件,使用–system选项。
  • ~/.gitconfig :用户目录下的配置文件只适用于该用户,使用–global选项。
  • .git/config :当前项目的.git目录中的配置文件,仅针对当前项目有效。
bash
git config --global user.name "WangYan"
git config --global user.email "WangYan@example.com"
git config --global core.editor vim
git config --global merge.tool vimdiff

2.4、密钥配置

首先生成密钥对,然后上传.pub后缀的公钥,到github这类托管平台。

bash
mkdir ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa -C "WangYan@example.com" -N '' #生成密钥对

测试密钥是否有效,并提示密钥所属用户ID或所属版本库ID

bash
ssh -T git@github.com

2.5、自动完成

bash
#wget http://www.wangyan.cloud/download/conf/.git-completion.bash
cp contrib/completion/git-completion.bash ~/.git-completion.bash
cat >>~/.bashrc<<EOF
source ~/.git-completion.bash
EOF

2.6、命令别名

bash
git config --global alias.ci commit #实例1:ci 提交
git config --global alias.last 'log -1 HEAD' #实例2:查询最新版本
git config --global alias.visual "!gitk" #实例3:运行外部命令 

三、Git 基础使用

3.1、常规操作

3.1.1、创建Git项目

bash
git init #从当前目录初始化
git clone git://gist.github.com/xx.git #从现有仓库克隆

3.1.2、检查当前文件状态

bash
git status
  • Untracked files:表示未跟踪文件。(新文件)
  • Changes to be committed:表示已暂存,但未提交。(已git add,但未提交)
  • Changed but not updated:已修改,但未暂存(文件已修改,未git add暂存)

3.1.3、跟踪新文件

bash
git add file1.txt(文件或目录的路径,目录则递归处理)
git add .(跟踪所在目录下的所有文件及子目录)

3.1.4、忽略某些文件不跟踪

bash
cat >.gitignore<<-EOF
# 忽略注释
*.a 忽略所有.a 结尾的文件
*.[oa] 忽略所有以.o 或.a 结尾的文件
!lib.a 忽略除lib.a 外的文件
/TODO 忽略根目录下的TODO 文件
build/ 忽略build/ 目录下的所有文件
doc/*.txt 忽略doc/notes.txt
EOF

3.1.5、暂存已修改文件

注:git add 既可以跟踪新文件,也可以暂存已修改文件。

bash
git add .

3.1.6、查看已暂存和未暂存差异

bash
git diff:查看未暂存和已暂存文件间的差异。
git diff --cached 查看已暂存和上次提交时的差异

3.1.7、删除/移动已跟踪文件

bash
git rm file.txt
git rm -f file.txt 强制删除,适用于已修改且已暂存。
git rm --cached file.txt 从跟踪清单中删除,但不实际删除文件。
git rm *~ 删除当前目录下所有~结尾的文件。
git rm \*~ 递归删除当前目录及子目录下所有~结尾的文件。
bash
git mv file1 file2 #移动文件

3.1.8、提交更新

bash
git commit
git commit -m "Story 1: Fix some bugs"

跳过暂存直接提交

bash
git commit -a -m "Story 2: Fix some bugs"

3.1.9、查看提交历史

bash
git log 按提交时间列出所有的更新,最近的更新排在最上面。

-p 展开显示每次提交的内容差异。-n 仅显示最近的n 条提交。--stat 仅显示简要的增改行数统计。--author 仅显示指定作者相关的提交。--committer 仅显示指定提交者相关的提交。--grep 搜索提交说明中的关键字。--all-match 同时满足指定的选项。

bash
git log --since=2.weeks
git log --since="2008-10-01" --before="2008-11-01"

--since, --after 仅显示指定时间之后的提交。--until, --before 仅显示指定时间之前的提交。

3.1.10、查看版本细节

bash
git show xx 查看项目特定版本更新细节
git show HEAD 显示当前分支的最新版本的更新细节

git show HEAD^ 查看HEAD 的父版本更新细节
git show HEAD^^ 查看HEAD 的祖父版本更新细节
git show HEAD~4 查看HEAD 的祖父之祖父的版本更新细节

3.2、撤销操作

3.2.1、修改最后一次提交

bash
git commit --amend

注:若文件状态没变化,则修改提交说明,否则修正并覆盖上次提交。

3.2.2、取消已经暂存的文件

bash
git reset HEAD filename

3.2.3、取消对文件的修改

bash
git checkout -- filename

3.3、远程仓库的使用

3.3.1、查看项目的远程库

bash
git remote -v (-v 选项显示对应远程库地址)
实例:origin git://github.com/schacon/ticgit.git

3.3.2、添加远程仓库

bash
git remote add [shortname] [url]
实例:git remote add pb git://github.com/paulboone/ticgit.git

3.3.3、从远程仓库抓取数据

从指定远程仓库中拉取所有本地仓库没有的数据。

bash
git fetch [remote-name]

注意事项:

  • 如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。
  • fetch 命令只拉取数据,不会自动合并到当前工作分支。
  • git clone 本质是创建本地 master 分支,并用于跟踪远程仓库中的 master 分支。

3.3.4、推送数据到远程仓库

bash
git push [remote-name] [branch-name]
实例:git push origin master

注:克隆操作会自动使用默认的master仓库和origin分支名称

3.3.5、查看远程仓库信息

bash
git remote show [remote-name]

1)New remote branches 哪些远端分支还没有同步到本地

2)Local branch pushed with ‘git push’ 运行git push 时缺省推送的分支

3)Stale tracking branches 已同步到本地的远端分支在远端服务器上已被删除。

3.3.6、远程仓库的删除和重命名

bash
git remote rename [remote-name] [new-remote-name] #重命名
git remote rm [remote-name] #删除

3.4、本地标签管理

3.4.1、显示已有的标签

bash
git tag #按字母顺序显示
git tag -l 'v1.4.2.*' #显示特定标签 

3.4.2、新建标签

bash
git tag v1.4  #轻量级的标签 
git tag -a v1.4 -m 'my version 1.4' #含附注的标签

3.4.3、后期加注标签

bash
git tag -a v1.2 9fceb02

3.4.4、签署验证标签

bash
git  -s v1.5 -m 'my signed 1.5 tag' #签署标签
git tag -v [tag-name] #验证标签
git show [tag-name] #查看相应标签的版本信息

3.4.5、推送标签至远程仓库

bash
git push origin [tagname] #推送某个标签
git push origin --tags #推送所有标签

3.4.6、删除标签

bash
git tag -d v1.0.0 #删除本地标签
git push origin :refs/tags/v1.0.0 #删除远程标签

四、GIt 分支管理

4.1、新建本地分支

bash
git branch testing #创建testing分支
git checkout testing #切换至testing分支
git checkout -b iss53 #创建并切换至iss53分支。

4.2、合并本地分支

bash
git checkout master  #首先切换到主分支
git merge hotfix #测试完毕后,合并hotfix分支
git branch -d hotfix #删除已合并的hotfix分支

4.3、解决合并冲突

bash
git status #合并失败的文件以"unmerged"标出
git add . #标记冲突已解决,并暂存文件
git mergetool #Git默认图形化冲突解决工具

4.4、合并远程分支

bash
origin/master #格式:远程仓库/分支名
git merge origin/serverfix #合并远程分支serverfix到当前分支

4.5、删除远程分支

bash
#git push [远程仓库名] :[远程分支]
#注意区别:git push [远程名] [本地分支]:[远程分支]
git push origin :serverfix #删除远程分支

4.6、创建跟踪分支

方法一:

bash
git checkout -b [分支名] [远程名]/[分支名]
git checkout -b serverfix origin/serverfix

方法二:(适用1.6.2以上版本Git)

bash
git checkout --track [远程名]/[分支名] 
git checkout --track origin/serverfix

4.7、查看分支

bash
git branch #列出所有分支,星号"*"表示当前所在分支。
git branch -v #查看各分支最后一次提交信息

#查看已和当前分支合并的分支
#可用git branch -d 删掉未标星号的分支,因为已经合并了。
git branch --merged 

#查看未和当前分支合并的分支
#强制删除未合并的分支git branch -D
git branch --no-merged 

4.8、衍合所在分支

bash
git checkout experiment #切换到需要衍合的分支
git rebase master #衍合experiment分支到主分支
ESC