Git

Git 是一个非常出色的版本控制工具。

安装

yum install -y git

配置

~/.gitconfig

git config --global user.name "username"
git config --global user.email "username@example.com"

工作流程

# 克隆到本地,可选https和ssh,如果需要频繁提交的话建议使用ssh,要添加相应的证书
git clone git@github.com:phpredis/phpredis.git 
# 从远程服务器拉取文件,更新文件
git pull 
# 从master分支创建并且检出到分支
git checkout -b check_in_demo 
# 编辑本地文件
vi hello_world.php
# 添加到缓存区
git add hello_world.php
# 提交到本地
git commit -m 'Check in demo.' 
# 推送到服务器
git push origin check_in_demo
# 检出master分支
git checkout master
# 从分支合并到master
git merge --no-ff check_in_demo
# 提交到本地
git commit -m 'merge from branch check_in_demo'
# 提交到远程
git push origin master

常用操作

远程仓库 remote 操作

检出仓库:

$ git clone git://github.com/jquery/jquery.git

检出仓库:直接检出分支 2.0.0,指定远程仓库名称为 github (默认为 origin)、检出到文件夹 jquery2 (默认为 jquery)

$ git clone -o github -b 2.0.0 git://github.com/jquery/jquery.git jquery2

查看远程仓库:

$ git remote -v

添加远程仓库:

$ git remote add [name] [url]

删除远程仓库:

$ git remote rm [name]

修改远程仓库:

$ git remote set-url --push [name] [newUrl]

拉取远程仓库:

$ git pull [remoteName] [localBranchName]

推送远程仓库:

$ git push [remoteName] [localBranchName]

强制推送更改:慎用!!会覆盖他人的改动,可能会被打死

$ git push --force origin master
  • 如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$ git push origin test:master         // 提交本地test分支作为远程的master分支
$ git push origin test:test              // 提交本地test分支作为远程的test分支

分支 branch 操作

获取当前分支名称

 git symbolic-ref --short -q HEAD

查看本地分支:

$ git branch

查看远程分支:(如果还是看不到就先 git fetch origin 先)

$ git branch -r

创建本地分支:(注意新分支创建后不会自动切换为当前分支)

$ git branch [name]

切换分支:

$ git checkout [name]

创建新分支并立即切换到新分支:

$ git checkout -b [name]

直接检出远程分支: (如:git checkout -b myNewBranch origin/dragon)

$ git checkout -b [name] [remoteName]

删除分支:

$ git branch -d [name]

-d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项

合并分支:

$ git merge [name]

将名称为[name]的分支与当前分支合并

合并最后的2个提交:

$ git rebase -i HEAD~2

数字2按需修改即可(如果需提交到远端$ git push -f origin master 慎用!)

创建远程分支(本地分支push到远程):

$ git push origin [name]

删除远程分支:

$ git push origin :heads/[name]

$ git push origin :[name]

修改本地分支名称:

git branch -m <old_branch_name> <new_branch_name>

直接修改远程分支名称(不修改本地的):

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

修改本地及其远程分支的名称:

1. git branch -m <old_name> <new_name>
2. git push <remote> --set-upstream new_name
3. git push <remote> :old_name

对于其它客户端的仓库,需要执行如下两个命令获取最新的修改:

4. git fetch <remote>
5. git remote prune <remote>
  • 创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)

方法1:

$ git checkout --orphan <branch_name>
$ git rm -rf *

方法2:

$ git symbolic-ref HEAD refs/heads/[name]
$ rm .git/index
$ git clean -fdx

版本 tag 操作

查看版本:

$ git tag

创建版本:

$ git tag [name]

删除版本:

$ git tag -d [name]

查看远程版本:

$ git tag -r

创建远程版本(本地版本push到远程):

$ git push origin [name]

删除远程版本:

$ git push origin :refs/tags/[name]

合并远程仓库的tag到本地:

$ git pull origin --tags

上传本地tag到远程仓库:

$ git push origin --tags

创建带注释的tag:

$ git tag -a [name] -m 'yourMessage'

后悔药

删除当前仓库内未受版本管理的文件:

$ git clean -f

恢复仓库到上一次的提交状态:

$ git reset --hard $version

回退所有内容到上一个版本:

$ git reset HEAD^

回退a.py这个文件的版本到上一个版本:

$ git reset HEAD^ a.py

回退到某个版本:

$ git reset 057d

将本地的状态回退到和远程的一样:

$ git reset –hard origin/master

向前回退到第3个版本:

$ git reset –soft HEAD~3

修改最后的提交日志:

$ git commit --amend

修改最后的提交日期为当前时间:

$ git commit --amend  --date="$(date -R)"

强制提交

 git push origin  master --force

查看提交日志

》查看文件中的每一行的作者、最新的变更提交和提交时间

$ git blame [fileName]

》查看仓库历史记录 有三个应该知道的选项。 --oneline - 压缩模式,在每个提交的旁边显示经过精简的提交哈希码和提交信息,以一行显示。 --graph - 图形模式,使用该选项会在输出的左边绘制一张基于文本格式的历史信息表示图。如果你查看的是单个分支的历史记录的话,该选项无效。 --all - 显示所有分支的历史记录 把这些选项组合起来之后如下:

使用

$ git log --oneline --graph --name-status

既可以看到简介的日志信息,也可以看到改了哪些文件,一举两得:

差异查看

$ git diff --name-status HEAD~2 HEAD~3 <-- 获得两个版本间所有变更的文件列表
$ git diff HEAD HEAD~1 <-- 查看最近两个提交之间的差异
$ git diff HEAD HEAD~2 <-- 查看第1个与第3个提交之间的差异
^ - 代表父提交,^n 表示第n个父提交,^相当于^1 git寻根:^和~的区别 - 分析得很到位
~ - 代表连续的提交,~n相当于连续的第n个提交
$ git diff master..test <-- 比较两个分支之间的差异
$ git diff master...test <-- 比较master、test的共有父分支和 test 分支之间的差异
$ git diff test <-- 比较当前工作目录与 test 分支的差异
$ git diff HEAD <-- 比较当前工作目录与上次提交的差异
$ git diff HEAD -- ./lib  <-- 比较当前工作目录下的lib目录与上次提交的差异
$ git diff --stat  <-- 统计一下有哪些文件被改动,有多少行被改动
$ git diff --cached  <-- 查看下次提交时要提交的内容(staged,添加到索引中)

使用 gitignore 设置忽略文件和文件夹

详见 gitignore

FAQs

1. git: Error: Some Local Refs Could Not Be Updated;

解决方法:

git remote prune origin

2. fatal: refusing to merge unrelated histories

解决方法:

git pull --allow-unrelated-histories

3. fatal: could not read Username for 'https://xxx.com/xx/xx': terminal prompts disabled

原因go get disable "terminal prompt" by default(Go get 命令默认禁用terminal prompt,即终端提示)

解决方案:环境设置GIT_TERMINAL_PROMPT=1

参见

参考链接