git 使用杂项

2015-09-10 devops git cheatsheet

记录 git 常见的示例,可以用来作为参考使用。

常用命令

----- 强制同步远端数据
$ git fetch --all                 ← git fetch origin
$ git reset --hard origin/master
$ git pull origin master

----- 配置用户名密码
$ git config --global user.name  "Your Name"
$ git config --global user.email "yourname@example.com"
$ git config --list

----- 如果不关心文件权限等,如Windows中
$ git config core.filemode false

----- 初始化或者clone一个库
$ git init
$ git clone https://github.com/user/repository.git
$ git help clone

----- 从远端更新,origin指定远端库,master为远端分支
$ git pull origin master              ← 等价于fetch+merge
$ git fetch origin master             ← 只获取远程分支
$ git merge origin master             ← 手动合并

----- 查看远端服务器,修改origin,以及添加remote分支
$ git remote -v
$ git remote set-url origin http//github.com/repo.git
$ git remote add remote-name https://github.com/user/repo.git

----- 查看提交的差异内容
$ git diff                                               ← 未添加到staged的提交
$ git diff --cached                                      ← 已经staged但是未commited的提交
$ git diff origin/master                                 ← 本地修改与远端master的差异
$ git diff COMMIT1_ID COMMIT2_ID                         ← 两次提交的修改
$ git diff --name-only COMMIT1_ID COMMIT2_ID             ← 只查看修改的文件
$ git diff-tree --no-commit-id --name-only -r COMMIT_ID  ← 某次提交的修改
$ git show --pretty="format:" --name-only COMMIT_ID      ← 同上
$ git show COMMIT_ID                                     ← 查看详细细节

----- 当前的状态,然后添加到staged,并提交
$ git status
$ git add changed_file.txt
$ git add folder-with-changed-files/
$ git commit -m "Commiting changes"

----- 重命名或者删除一些文件
$ git rm removeme.txt tmp/crap.txt
$ git mv file_oldname.txt file_newname.txt
$ git commit -m "deleting 2 files, renaming 1"

----- 修改最近一次提交的提交信息,并提交到远端
$ git commit --amend -m "New commit message"
$ git push origin master

----- 查看日志
$ git log                                                ← 最近的提交日志
$ git log -2                                             ← 最近的两个提交日志
$ git log -p -2                                          ← 查看最近两次的详细日志
$ git log --pretty=oneline                               ← 单行打印

----- 通过一次提交回退一次提交,会保存一次新的commit
$ git revert dd61ab21
----- 取消一次提交
$ git reset --soft  HEAD~1                               ← 删除上次commit,文件回退到stage
$ git reset --soft  HEAD@{1}
$ git reset --mixed HEAD~1                               ← (默认)删除上次commit,文件回退到工作区
$ git reset --hard  HEAD~1                               ← 彻底回到上次commit,文件回被删除
$ git reset 56e05fced
$ git reset origin/master                                ← 取消本地未提交的内容
$ git fetch origin                                       ← 或者直接获取远端的内容
$ git reset --hard origin/master                         ← 接上

----- 插件本地分支以及所有分支
$ git branch
$ git branch -a

----- 生成patch文件
$ git diff > patch-issue-1.patch                         ← 做些修改,创建patch
$ git add newfile                                        ← 新建文件并创建patch
$ git diff --staged > patch-issue-2.patch                ← 接上
$ git add newfile                                        ← 添加新文件,做些修改并创建一个patch
$ git diff HEAD > patch-issue-2.patch                    ← 接上
$ git format-patch COMMIT_ID                             ← 为某个commit生成patch
$ git format-patch HEAD~2                                ← 最近两次提交生成patch
$ git format-patch origin/master                         ← 为所有未提交内容生成patch
$ git format-patch --binary --full-index origin/master   ← 创建包含二进制文件的patch
$ git apply -v patch-name.patch                          ← 应用patch
$ git am patch1.patch                                    ← 应用通过format-patch生成的patch

----- 获取最近一次提交的完整CommitID以及短ID
$ git rev-parse HEAD
$ git rev-parse --short HEAD

----- 本地分支重命名(还没有推送到远程)
$ git branch -m oldName newName

----- 远程分支重命名(已经推送远程-假设本地分支和远程对应分支名称相同)
--- A. 重命名远程分支对应的本地分支
$ git branch -m oldName newName
--- B. 删除远程分支
$ git push --delete origin oldName
--- C. 上传新命名的本地分支
$ git push origin newName
--- D. 把修改后的本地分支与远程分支关联
$ git branch --set-upstream-to origin/newName

----- 替换已经存在的远端仓库,也就是报remote origin already exists
----- 1. 首先删除origin的远程仓库
$ git remote rm origin
----- 2. 再添加远程git仓库
$ git remote add origin git@github.com:FBing/java-code-generator
$ git push -u origin --all
$ git push -u origin --tags

TAG 管理

一般可以通过 git describe 显示离当前提交最近的 TAG 信息,如果最近有提交为 TAG,则只显示 TAG 信息,否则会有相关的后缀来描述该 TAG 后有多少次提交,以及最新的 CommitID 。

v1.0.0-rc1-10-g0c2b1cf
  v1.0.0-rc 表示TAG的信息
  10 表示自从打了v1.0.0-rc1之后又有10提交
  g0c2b1cf g为git缩写,用于区分多个版本管理工具;0c2b1cf表示最新提交的CommitID

当知道了该信息后,如果要检查某个版本的问题,可以直接通过 git checkout 0c2b1cf 切换到对应的代码。

多分支管理

首先,TAG 信息是全局的,但是不同的分支可以分别通过 git describe 显示版本信息。例如,在开源开发时有内部版本和开源版本,那么就可以通两个分支进行管理,分别打 TAG 信息。

$ git init
$ echo "Version 1" > README.md
$ git add -A .
$ git commit -m "Version 1.0"
$ git tag -a v1.0 -m 'Version 1.0'
$ git push origin --tags       # 提交到远端,或者 git push --tags 也可以

$ git checkout -b master-os
$ echo "Version 2" > README.md
$ git add -A .
$ git commit -m "Version 2.0"
$ git tag -a v2.0 -m 'Version 2.0'

$ git describe --match "v[0-9]*" --abbrev=5 HEAD 2>/dev/null

----- 删除,同时删除远端
$ git tag -d v1.0.0
$ git push origin :refs/tags/v1.0.0

其它

注意,如果要使用 describe 功能,需要使用 Annotated Tags ,否则会报错,命令行中可以通过如下命令执行。

$ git tag -a v1.4 -m "version 1.4"

其它

修改远端地址

主要所有如下几种方法。

----- 0. 查看当前的远端设置
$ git remote -v

----- 1. 直接修改配置
$ git remote set-url origin [URL]
----- 2. 删除后再重新添加
$ git remote rm origin
$ git remote add origin [URL]

参考