Git的使用

下面所写的其实是写给公司内部Git的操作手册,我在这里也记录下。

修改Git配置

windows操作系统换行配置

git config --global core.autocrlf input

用户名、邮箱配置

git config user.name yourname --local
git config user.email yourname@tudou.com --local

克隆v3代码库

git clone git@gitlab.intra.tudou.com:static/v3.git

查看分支

列出本地所有的分支

git branch

列出远程所有的分支

git branch -r

创建分支

基于本地分支创建

git branch [BRANCH_NAME]
git push origin [BRANCH_NAME]

基于远程分支创建

git branch [BRANCH_NAME] origin/master

本地分支与远程分支绑定

绑定后操作就能​省略origin [branch],使用起来更加方便高效,当然如果有多个远程需要操作就不能省略了

git push -u origin [branch]

切换分支

切换到本地分支,如果本地分支不存在自动寻找远程分支

git checkout [BRANCH_NAME]

更新分支

更新master

  git pull --rebase origin master

解决rebase冲突。

  git status

根据提示打开对应文件,搜索"<<<<<<<"字符,解决冲突后执行

  git add -u
  git rebase --continue

停止pull操作,回pull rebase之前的状态

  git rebase --abort

提交代码

提交到本地版本库

git commit -m "commit message"

提交到远程master

git push origin master

合并分支

切换到master。

  git checkout master

合并分支。

  git merge --no-ff [BRANCH_NAME]

解决src目录下的冲突。

https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line

使用外部工具解决冲突

解决本次合并的所有冲突

git mergetool

解决特定文件的冲突

git mergetool src/js/g.js
重新构建build、dist目录下的所有冲突的文件。

  ytpm [PATH]

提交代码。

 git add .
  git commit -m "commit message"

恢复代码

放弃本地修改(废弃本地所有未提交的文件,和远程保持一致)

  git reset --hard origin/master

恢复一个提交

  git revert [COMMIT_ID]

恢复merge

  git revert -m 1 [MERGE_COMMIT_ID]

恢复到指定版本

  git reset --hard [COMMIT_ID]

删除分支

删除本地分支

git branch -d [BRANCH_NAME]

删除远程分支

git push origin --delete [BRANCH_NAME]

查看变更记录

查看变更历史

git log --decorate --numstat [PATH]

查看某个提交记录

git show --name-only [COMMIT_ID]

对比文件

git默认方式

对比工作区版本和暂存区版本

git diff -- [PATH]

对比暂存区版本和版本库版本

git diff --cached -- [PATH]

对比工作区版本和版本库版本(HEAD)

git diff HEAD -- [PATH]

对比两个提交过的文件

git diff [COMMIT_ID_1] [COMMIT_ID_2] -- [PATH]

对比两个分支的文件

git diff develop master -- src/js/g.js
git diff develop:src/js/g.js master:src/js/g.js

查看其它分支上的文件

git show master:src/js/g.js

外部比较工具完成比较

比较本次合并的所有修改(只与提交前的记录比较)

git difftool

比较指定文件的历史版本

git difftool [Git Hash] HEAD -- src/js/g.js

不小心在develop上进行开发时解决方案

未提交时

git stash
git checkout [BRANCH_NAME]
git stash pop

已提交时

git log -1 # 记住COMMIT ID
git reset --hard origin/develop
git checkout [BRANCH_NAME]
git cherry-pick [COMMIT_ID]

不小心将develop或基于develop创建的分支合并到master上时解决方案

A--M---B  <---develop
        \
--C--G---J---P---Q  <---master

如上例,需要先确认好J这次错误提交点以及其之前、之后提交点的hash值,并确保当前HEAD处于Q上,接着执行:

git rebase -i -p --onto P G

执行完后需要手工解决之后每次提交出现的冲突,手工比较解决掉冲突后执行:

git add . // 添加此次冲突修改

git rebase --continue

注意,上面的步骤可能会进行很多次,每次都是上面的方法;手工比较的方法可以参看[外部比较工具][1]的使用方式。

其它
Beyond Compare比较工具配置
在~/.gitconfig文件中加入以下配置,使用的比较工具为Beyond Compare,大家可以自行下载;如果是win用户对应的路径需要相应的修改。

另外,Mac版的 Beyond Compare 4 还需要进行设置让其支持通过命令行的方式调用:点击菜单 -> Install Commond Line Tools...然后输入系统登录密码即可。
[merge]
tool = bcomp
[mergetool]
prompt = false
keepBackup = false
[mergetool "bcomp"]
trustExitCode = true
cmd = "/usr/local/bin/bcomp" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
[diff]
tool = bcomp
[difftool]
prompt = false
[difftool "bcomp"]
trustExitCode = true
cmd = "/usr/local/bin/bcomp" "$LOCAL" "$REMOTE"

常用git​ Alias

[alias]
st = status --short --branch
pu = pull --rebase
ca = commit --amend
ci = commit -a -v
br = branch
bv = branch -vv
co = checkout
cb = checkout -b
df = diff
un = reset --hard HEAD
uh = reset --hard HEAD^
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
ld = log --pretty=format:"%C(yellow)%h\\ %C(green)%ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short --graph
ls = log --pretty=format:"%C(green)%h\\ %C(yellow)[%ad]%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=relative