0%

用到的git

常用的git的一些东西

1. 一个好用的log别名

1
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

git lg

2. 远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 添加远程仓库
git remote add origin git@oschina.com:haha.git

# 更换远程仓库的地址,比如从https协议的地址换到ssl地址
git remote set-url origin new_url

# 检出远程分支
git checkout --track origin/dev_mc

# 查看远程仓库
git remote -v

# 提交到远程仓库
git push [remote] [branch]

# 提交所有本地匹配的分支到远端
git config --global push.default matching
# 没有指明分支的话,只提交当前分支到远端
git config --global push.default simple

3. 标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 列出标签
git tag

# 添加含附注的标签
git tag -a v1.4 -m "my version 1.4"

# 添加轻量级标签
git tag v1.4-lw

# 给先前提交打上标签
git tag -a v1.2 9fceb02

# 上传标签到远程仓库
git push origin v1.5
git push origin --tags

4. 比较

1
2
3
4
5
6
7
8
# 比较两个分支
git diff dev_mc..master

# 比较两个分支的共同父分支和master之间的区别
git diff dev_mc...master

# 列出比较的大概内容,方便看到哪些文件发生了改变
git diff --stat dev_mc..master

5. 修改最后一次提交

1
git commit --amend msg

6. 撤销操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# reset会撤销提交,撤销的提交成为悬挂提交,再提交新的会丢掉先前的提交。
# checkout不会撤销历史,而是改变缓冲区和工作区。
# revert只能针对整个系统,而不能只针对某个文件路径。不会撤销提交历史,而是先将缓冲区和工作区
# 同步到revert的历史,再在分支上添加一个新的提交。这样是比较安全的做法。


# 重置提交历史,缓存区和工作区都不改变。
git reset --soft HEAD

# 缓存区会变,工作区不变。默认操作。
git reset --mixed HEAD

# 缓存区和工作区都改变,彻底不要当前修改
git reset --hard HEAD

# 回退两个提交
git reset HEAD~2

# checkout只会改变工作区,并不撤销提交历史。
git checkout HEAD~2

# revert不会撤销提交历史,而是先找到要回退的版本,再往后添加1个新的提交.
# 回退两个,再提交1个新的提交。是比较安全的做法。这个不能针对文件层面进行操作
git revert HEAD~2

7. 忽略已经存在的文件

1
2
3
4
5
6
7
8
# 先从cached中删除
git rm -r --cached .idea

# 再更新.gitignore
git add .gitignore

# 最后提交
git commit -m "ignore .idea"

8. 代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# http代理
git config --global http.proxy "用户名:密码@127.0.0.1:6666"

# git协议代理(git协议也是走ssh,所以配置ssh就行了,不需HTTP代理服务器)
# 在~/.ssh/config中配置如下:
host AA
hostname 192.168.0.100
port 1540
user root

host gitlab.com
hostname gitlab.com
user git
ProxyCommand ssh -W %h:%p AA

9. 彩色输出

1
git config --global color.ui auto

10 windows换行符问题

windows git 配置

1
git config --global core.autocrlf true
  • true: 提交转换成LF,检出转换成 CRLF
  • input: 提交时转换LF,检出时不转换
  • false: 都不转换

11 修改最后一次author

1
git commit -amend --reset-author

12 patch

生成patch

1
2
3
4
5
6
7
8
git format-patch HEAD^                 #生成最近的1次commit的patch
git format-patch HEAD^^              #生成最近的2次commit的patch
git format-patch HEAD^^^              #生成最近的3次commit的patch
git format-patch HEAD^^^^             #生成最近的4次commit的patch
git format-patch <r1>..<r2> #生成两个commit间的修改的patch(包含两个commit. <r1>和<r2>都是具体的commit号)
git format-patch -1 <r1> #生成单个commit的patch
git format-patch <r1> #生成某commit以来的修改patch(不包含该commit)
git format-patch --root <r1>             #生成从根到r1提交的所有patch

应用patch

1
2
git apply -3 patchfile
git am -3 patchfile

然后使用vs的合并功能进行合并

13 软件自动生成版本号时, 从git取的相关信息,cmake相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD
OUTPUT_VARIABLE COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
execute_process(
COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
OUTPUT_VARIABLE BRANCH_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

execute_process(
COMMAND ${GIT_EXECUTABLE} log --format=format:%aI -1
OUTPUT_VARIABLE COMMIT_TIME
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

execute_process(
COMMAND bash -c "git diff --quiet --exit-code || echo _beta"
OUTPUT_VARIABLE BETA_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()

configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/version.h.ini
${CMAKE_CURRENT_BINARY_DIR}/version.h
@ONLY)

message(STATUS "Git version is ${BRANCH_NAME} ${COMMIT_HASH}/${COMMIT_TIME} ${BUILD_TIME}")

version.h.ini中是这样的:

1
2
3
4
5
#define COMMIT_HASH "@COMMIT_HASH@"
#define COMMIT_TIME "@COMMIT_TIME@"
#define BRANCH_NAME "@BRANCH_NAME@"
#define BUILD_TIME "@BUILD_TIME@"
#define BETA_VERSION "@BETA_VERSION@"

14 用reflog恢复本地丢失的提交

git reflog查看本地所有提交过的记录,包括reset掉的, 然后用git reset强制恢复。

参考:

  1. https://segmentfault.com/q/1010000000430426
  2. https://imciel.com/2016/06/28/git-proxy/