一个计算机技术爱好者与学习者

0%

好好学Git:Git常用命令

1. 前言

本文记录一下常用的Git命令,方便以后查阅。

参考文档:

2. Git安装与配置

参考文档:《好好学Git:Git安装与配置》

3. pull代码

3.1. pull相关配置

.git/config文件里,配置了remote和branch,以下为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://github.com/voidking/voidking.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master

拉取项目的时候,会根据这个配置来拉取。

3.2. pull相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看本地分支追踪的远程分支
# 一个本地分支可以追踪多个远程分支
git branch -vv

# 格式说明
git pull <远程仓库名> <远程分支名>:<本地分支名>

# 拉取当前分支追踪的唯一远程分支
git pull

# 拉取当前分支追踪的origin/master分支
git pull origin master
git pull origin

# 拉取remote origin的next分支,与本地master合并
git pull origin next:master

# 拉取origin主机的next分支,与当前分支合并
git pull origin next

3.3. 解决冲突

问题描述:git pull 之后,出现冲突。
冲突文件中,包含:

1
2
3
4
5
<<<<<<< HEAD
xxx
=======
yyy
>>>>>>> f406c5e398760c7d9116c8af31ea5748bd344abe

其中,<<<<<<< HEAD 和 ======= 中间的是自己的代码;======= 和 >>>>>>> f406c5e398760c7d9116c8af31ea5748bd344abe 中间的是其他人修改的代码。

解决冲突办法:确定保留哪一部分代码,然后删除标志 <<<<<<< HEAD ,======= ,>>>>>>> f406c5e398760c7d9116c8af31ea5748bd344abe

详情参考文档《git branch》中的代码合并部分,原理是一样的。

4. fetch代码

拉取github的某个pr:

1
2
3
git fetch origin pull/29/head:pr29
git branch -a
git chackout pr29

5. 分支操作

详情参考文档《git branch》

6. commit代码

6.1. 单行commit

1
2
git add .
git commit -m "something"

6.2. 多行commit

1
2
3
4
5
6
7
8
git add .
git commit -m "
dquote> <类型>[可选的作用域]: <描述>
dquote>
dquote> [可选的正文]
dquote>
dquote> [可选的脚注]
dquote> "

6.3. 查看commit记录

1、最常用查看commit记录

1
git log

只可以查看到当前分支的commit日志,而且不能查看已经删除了的commit操作。

2、查看单个文件commit记录

1
git log filename

3、查看全局日志

1
2
git reflog
git log -g

可以查看所有分支的所有操作记录,包括reset操作、checkout操作、已经删除了的commit操作等等。

4、查看所有分支的commit

1
git log --graph --pretty=oneline --abbrev-commit

7. 查看变更

7.1. commit之前

执行commit之前,查看修改了哪些文件。

1
git status

7.2. commit之后

执行commit之后,获取最近一次修改的文件列表

1
git diff --name-only HEAD~ HEAD

查看两次commit之间修改的文件

1
git diff --name-only <commit-1> <commit-2>

8. push代码

8.1. push分支

push命令格式:

1
git push <远程仓库名> <本地分支名>:<远程分支名>

上传代码到唯一远程追踪分支

1
git push

上传到指定远程追踪分支

1
git push origin HEAD:branch_name

8.2. 同时push多个git仓库

1、编辑 .git/config,添加

1
2
3
[remote "all"]
url = https://github.com/voidking/hexo-backup
url = https://gitee.com/voidking/hexo-backup

2、push代码

1
git push all

8.3. 同时push到多个git仓库的不同分支

1、添加多个远程仓库

1
2
git remote add repo1 <远程仓库URL>
git remote add repo2 <远程仓库URL>

2、push到多个远程仓库

1
2
git push repo1 HEAD:main
git push repo2 HEAD:master

此时仍然需要两条命令。

3、配置别名

1
git config alias.pushall '!git push repo1 HEAD:main && git push repo2 HEAD:master'

配置别名错误的话,可以在配置文件中修改 .git/config

4、push到多个远程仓库

1
git pushall

8.4. push到其他git仓库

需求:已有仓库voidking,包含多个分支。现在想要把该仓库根据不同的分支拆分成多个项目,于是创建项目voidkingA和voidkingB。接下来,该怎么把voidking的不同分支,push到voidkingA和voidkingB呢?

1
2
3
4
5
cd voidking
git checkout -b voidkingA origin/branchA
git push --force --quiet "https://voidking:xxxxxx@github.com/voidking/voidkingA" voidkingA:main
git checkout -b voidkingB origin/branchB
git push --force --quiet "https://voidking:xxxxxx@github.com/voidking/voidkingB" voidkingB:main

8.5. git push 403

公司电脑(win10系统)以前有一个用户,github账号是haojin。现在电脑分配给我使用,但是,我的github账号是voidking,在我git push的时候报错403。

1
2
3
$ git push
remote: Permission to voidking/hexo-back-up.git denied to haojin.
fatal: unable to access 'https://github.com/voidking/hexo-back-up.git/': The requested URL returned error: 403

哪怕重置了全局设置的user.name和user.email,依然会报错。
原因:win10系统自动保存用户凭据,gitpush的时候默认使用以前的用户凭据。
解决办法:Win+X,搜索,控制面板,用户账户,凭据管理器,管理Windows凭据,普通凭据,删除github的凭据即可。

9. 版本回退

版本回退常用git resetgit revert命令,这两个命令都是作用于当前分支(HEAD所在的分支)。
git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

9.1. reset

1、每个文件单独版本回退

1
2
3
4
git status
git log
git reset 1fe37e1bcbb894a1b594cf405ae31880cbaa6cd7 filepath/filename
git checkout filepath/filename

2、全部文件版本回退

1
git reset --hard 1fe37e1bcbb894a1b594cf405ae31880cbaa6cd7

3、远程仓库回退

1
2
git reset --hard 1fe37e1bcbb894a1b594cf405ae31880cbaa6cd7
git push -f

4、回退后回退
reset后,回退版本之后的commit操作记录,都被删除掉了。
如果回退过之后又后悔了,那么,需要查看全局日志,然后再次执行reset操作。

1
2
git reflog
git reset a246dcd --hard

需要注意的是,版本回退,我们没有使用git checkout
假设当前在bugFix分支,使用git checkout,理论上输入如下命令:

1
2
git reflog
git checkout a246dcd

这时,输入git log,发现版本完美回退了。但是,这只是假象,输入git branch -a,发现HEAD从bugFix分支切换到了a246dcd那个commit。而bugFix分支,没有进行任何改变。所以,我们不使用git checkout进行版本回退,而是使用它进行历史版本的查看。

9.2. revert

1、全部文件版本回退

1
git revert cf000

2、远程仓库回退

1
git push origin HEAD:branch_name

回退过之后又后悔了,那么,执行reset操作即可。

1
2
git log
git reset a246dcd --hard

10. git stash

本地有修改,但是想拉取远端仓库上的最新代码到本地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 保存stash
git stash
git stash save "something"

# 拉取最新代码
git pull

# 查看stash
git stash list

# 弹出之前的修改
git stash pop

# 弹出之前的修改(只能恢复一次)
git stash pop stash@{num}

# 弹出之前的修改(可恢复多次)
git stash apply stash@{num}

# 删除stash
git stash drop stash@{num}

# 删除所有stash
git stash clear

11. 统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 统计个人代码量
git log --author="voidking" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

# 统计每个人代码量
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

# 统计提交者前五
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5

# 统计提交者数量
git log --pretty='%aN' | sort -u | wc -l

# 统计提交数
git log --oneline | wc -l

# 添加或修改的代码行数
git log --stat|perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/'
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-git-command/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~