Brooks

珍惜生命中的每一次冲动

0%

Git 常用命令

配置

SSH

1
2
3
4
5
#一轮回车到底,在用户目录下 .ssh文件夹下
$ ssh-keygen -t rsa -C "hyp.712@163.com"

#查看sh公钥
$ cat ~/.ssh/id_rsa.pub

查看全部配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git config -l

user.name=brooks
user.email=hyp.712@163.com
color.ui=auto
http.postbuffer=524288000
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@xxx.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

查看用户配置

1
2
3
4
5
6
$ git config --global -l

user.name=brooks
user.email=hyp.712@163.com
color.ui=auto
http.postbuffer=524288000

修改用户配置

1
2
$  git config --global user.name "输入你的用户名"
$ git config --global user.email "输入你的邮箱"

仓库

初始化仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir demo
cd demo

git init
touch README.md
git add README.md
git commit -m "first commit"

#添加仓库地址
git remote add xxx.git #项目地址
git push -u origin master

#已有仓库
cd existing_git_repo
git remote add origin xxx.git #项目地址
git push -u origin master

查看远程仓库地址

1
$ git remote -v

添加新的远程仓库

1
$ git remote add <remote> <url>

修改远程仓库地址

1
2
3
4
5
6
#方法一:直接修改
git remote set-url origin [url]

#方法二:先删除再修改地址
git remote rm origin
git remote add origin [url]

显示远程仓库信息

1
$ git remote show <remote>

关联本地和远程仓库

fatal: refusing to merge unrelated histories

1
2
#解决方案:
git pull origin master --allow-unrelated-histories

分支

查看本地分支

1
2
$ git branch
* master

master 分支前的 * 字符,它表示当前所在的分支。

查看远程分支

1
$ git branch -r

列出所有分支(local&remote)

1
$ git branch -a

切换分支

1
$ git checkout <branch>

创建并切换到新分支

1
$ git checkout -b <branch>

基于当前分支创建新分支

1
$ git branch <new-branch>

删除本地分支

1
$ git branch -d <branch>

删除远程分支

1
2
3
$ git push -d origin <branch>

$ git push -d origin <branch1> <branch2> <branch3> #删除多个分支

修改本地分支名称

1
$ git branch -m <old-branch> <new-branch> 

修改远程分支名称

1
2
3
4
5
6
7
8
9
10
#不能直接修改,步骤:
1、修改本地分支
2、删除远程分支
3、将新分支推上去
4、将新本地分支和远程相连

$ git branch -m <old-branch> <new-branch>
$ git push -d origin <old-branch>
$ git push origin <new-branch>
$ git push --set-upstream origin <new-branch>

操作

查看仓库文件状态

1
$ git status

查看未暂存文件变化

1
2
$ git diff  	   #查看未暂存 所有文件的变更
$ git diff <path> #查看未暂存 指定文件的变更

查看已暂存文件变化

1
2
$ git diff --cached	   		#查看已暂存 所有文件的变更
$ git diff --cached <path> #查看已暂存 指定文件的变更

添加暂存

1
2
$ git add . 	  #暂存所有 修改的文件
$ git add <path> #暂存指定 修改的文件

添加部分暂存

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
git add -p (git add --patch)命令,交互式暂存此文件的特定部分

这时有很多选项。 输入 ? 显示所有可以使用的命令列表:
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
? - print help

##中文版本:
y - 暂存此区块
n - 不暂存此区块
q - 退出;不暂存包括此块在内的剩余的区块
a - 暂存此块与此文件后面所有的区块
d - 不暂存此块与此文件后面所有的 区块
g - 选择并跳转至一个区块
/ - 搜索与给定正则表达式匹配的区块
j - 暂不决定,转至下一个未决定的区块
J - 暂不决定,转至一个区块
k - 暂不决定,转至上一个未决定的区块
K - 暂不决定,转至上一个区块
s - 将当前的区块分割成多个较小的区块
e - 手动编辑当前的区块
? - 输出帮助

通常,输入y暂存此部分,或者输入n跳过此部分就可以了

取消暂存

把对某个文件的修改添加到下次提交中

1
2
$ git restore --staged .   		#取消暂存 所有文件
$ git restore --staged <path> #取消暂存 指定文件

丢弃改动

1
$ git restore <path> 	#丢弃文件的改动

删除未跟踪文件

1
2
3
$ git clean -f  # 删除 untracked files
$ git clean -fd # 连 untracked 的目录也一起删掉
$ git clean -nfd # -n 参数来先看看会删掉哪些文件,防止重要文件被误删

提交

1
2
$ git commit -m 'message here'   #用于提交暂存区的文件
$ git commit -am 'message here' #用于提交跟踪过的文件,相当于省去了 git add

修改上次提交msg

1
2
3
4
5
$ git commit --amend	 # 首先使用命令后,会进入到vim 编辑器,修改注释信息,然后退出。

$ git commit --amend -m [message] # 如果代码没有任何新变化,则用来改写上一次commit的提交信息

$ git commit --amend [file1] [file2] # 重做上一次commit,并包括指定文件的新变化

git commit –amend 就是解决一些很小的改动,使得你不想在重现创建一个commit而设定。如果你的commit已经push到了远程仓库,那么使用–amend修改commit后,git push时一定要使用 –force-with-lease 参数。否则就会报错:

1
2
3
4
error: 无法推送一些引用到 'https://github.com/×××/test.git'
提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。
提示:再次推送前,先与远程变更合并(如 'git pull ...')。详见
提示:'git push --help' 中的 'Note about fast-forwards' 小节。

修改上次提交的author

1
2
3
git commit --amend --author="hyp <hyp.712@163.com>" 

执行后,:wq 保存退出即可。author修改为hyp。

修改前面某条的提交信息

1
2
3
4
git rebase -i HEAD~n

将需要修改的提交记录信息前的pick改为reword
:wq 保存退出,会自动弹出修改comment页面,修改保存退出

image-20240304175236349

合并多个提交为一个

1
2
#多笔提交合并  
git rebase -i HEAD~n

使用git rebase -i HEAD~n合并多笔提交,使用前使用git log查看要合并的commit共有几笔,然后将n替换为具体数字

如: git rebase -i HEAD~6 //将最新的6笔提交合并,执行命令后会看到如下vim界面,(git editor不是vim的可以使用 git config –global core.editor vim 进行配置)

1
2
3
4
5
6
7
8
pick 508a46de Import translations. DO NOT MERGE ANYWHERE
pick 0cc8cd9b CarSettings 适配MIAuto
pick 4ad57b0b add some comments Signed-off-by: dominic <

# 变基 0f0c6367..4ad57b0b 到 0f0c6367(3 个提交)
# 命令:
# p, pick <提交> = 使用提交
# ...

然后将第二行开始的pick改成s表示squash, 挤压到前一个提交, 保存退出后会进入一个新的Vim页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 这是一个 3 个提交的组合。
# 这是第一个提交说明:
Import translations. DO NOT MERGE ANYWHERE
Auto-generated-cl: translation import
Change-Id: I8760b7a4a1eeba58af7d68b0e4704c07187c7b28

# 这是提交说明 #2:
CarSettings 适配MIAuto
Change-Id: I1a5885fef6f9345aaf36a4a09047dbfc265ac175

# 这是提交说明 #3:
add some comments
Signed-off-by: dominic <hanguoliang1@xiaomi.com>
Change-Id: Ia0883583bc962ab97e6ef0ea7bb966b21028c87a

然后在这个页面进行编辑合并后的提交信息,删除无用的信息,保存退出,如果成功可以看到successfully rebased and updated等文案提示。以上操作可以实现将多笔提交合并为一笔,这样在Gerrit系统review的时候就不用查看多笔提交了。

更新

下载远程仓库代码,但不合并到HEAD中:

1
$ git fetch <remote>

将远程仓库代码合并到本地版本中:

1
2
3
4
$ git pull

$ git pull = git fetch + git merge FETCH_HEAD
$ git pull --rebase = git fetch + git rebase

强制拉取并覆盖本地代码

1
2
git fetch --all
git reset --hard origin/master

合并

将分支合并到当前HEAD中:

1
$ git merge <branch>   # 把 目标<branch>分支代码 合并到当前分支* 

将当前HEAD版本rebase到分支中:

1
$ git rebase <branch>  # 把 目标<branch>分支代码 合并到当前分支* 

退出rebase:

1
$ git rebase --abort

解决冲突后继续rebase:

1
$ git rebase --continue

在编辑器中手动解决冲突后,标记文件为已解决冲突

1
$ git add <resolved-file>

git rebase 与 git merge 区别

1
2
3
git merge会直接合并远端分支,有冲突时创建一个新的 commit 再提交。

git rebase 则是将本地的 commit 跟合并后有冲突的 commit 整合到一起,再提交到远端。这样可以保证 git 提交节点在一条线上,而不会因为冲突 commit 多出一个不在主流程线上的提交记录。

摘选

当你只需要部分代码变动(某几个提交)转移到另一个分支时,采用 Cherry pick(俗称:摘樱桃)。

1
2
3
4
5
6
7
8
9
10
11
12
$ git cherry-pick <commitHash>

#步骤
1.先从原分支查看git log获取待合并的 commitHash
2.然后checkout到目标分支
3.执行git cherry-pick commitHash,即可

git cherry-pick命令的常用配置项如下。
(1)-e,--edit 打开外部编辑器,编辑提交信息。
(2)-n,--no-commit 只更新工作区和暂存区,不产生新的提交。
(3)-x 在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
(4)-s,--signoff 在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

撤销

放弃工作目录下的所有修改:

1.如果是撤销所有的已经add的文件:

1
$ git reset HEAD    #等同于 git restore --staged .

2.如果是撤销某个文件或文件夹:

1
$ git reset HEAD <path>   #等同于 git restore --staged <path> 

3.回退到上次提交

1
$ git reset --hard HEAD^

4.回退到上上次提交

1
$ git reset --hard HEAD^^

5.重置一个提交(通过创建一个截然不同的新提交)

1
$ git revert <commit>

6.将HEAD重置到指定的版本,并抛弃该版本之后的所有修改:

1
$ git reset --hard <commit>

7.已经commit还未push,撤销

1
2
3
4
5
 git reset --soft HEAD^  #回退到上个版本
git reset --soft HEAD~3 #回退上上上一个版本

--soft #不删除工作空间的改动代码 ,撤销commit,不撤销git add file
--hard #删除工作空间的改动代码,撤销commit且撤销add

这样就成功撤销了commit,如果想要连着add也撤销的话,–soft改为–hard(删除工作空间的改动代码)。

发布

1
2
3
$ git push  
$ git push <origin> <branch> #如果添加多个仓库,指定仓库名称
$ git push origin develop #举例,提交远程origin仓库的develop分支

查看提交历史

1
2
3
4
5
6
7
8
$ git log   #查看所有历史
$ git log --author="username" #查看某个用户所有提交历史

$ git log --oneline -[n] #查看历史,单行显示提交历史,不展示详情 -5 最近五条
$ git log -p <path> #查看指定文件的提交历史


$ git reflog # 显示当前分支的最近几次提交

查看提交的内容

1
2
$ git show #查看最近的一此提交内容
$ git show commitid #查看指定的提交内容,,配合 git log --oneline 拿到commitid

回滚到某次commit

1
2
3
4
5
6
7
回退命令:
$ git reset --hard HEAD^ #回退到上个版本
$ git reset --hard HEAD~3 #回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id #退到/进到 指定commit的sha码

强推到远程:
$ git push origin HEAD --force

获取完整commit id

1
2
3
4
5
6
git rev-parse HEAD
323f71b499929e5436bc38d08722b64a606c173c

#获取short commit id(如:bb4f92a)
git rev-parse --short HEAD
323f71b499

存储

执行存储

1
$ git stash save "save message"

执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

查看存储列表

1
$ git stash list

显示存储改动的文件

1
$ git stash show

默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

显示存储改动的内容

1
$ git stash show -p  #显示第一个存储的改动,

默认show第一个如果显示其他存存储,命令后面加 stash@{$num} -p ,比如第二个:git stash show stash@{1} -p

应用某个存储

1
$ git stash apply

应用存储,但不会从存储列表中删除,默认使用第一个,即stash@{0},如果要使用其他追加 stash@{$num} , 比如第二个:git stash apply stash@{1}

应用存储且删除记录

1
$ git stash pop

应用存储,并从存储列表中删除,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

丢弃存储

1
$ git stash drop stash@{num]

丢弃stash@{$num}存储,从列表中删除这个存储

删除所有stash

1
$ git stash clear

本地修改打patch

1
2
使用 `git diff` 命令创建补丁文件。这将比较两个提交之间的差异,并将其输出到一个文件中。
git diff > my_patch.patch

应用patch

1
2
3
请将补丁文件复制到该代码库的根目录。在目标代码库中,运行 `git apply` 命令以应用补丁:

git apply my_patch.patch

标签

显示Tag列表

1
$ git tag

显示标签信息

1
2
3
4
5
6
$ git show v2.9_tag

tag v2.9_tag
Tagger: brooks <hyp712@163.com>
Date: Mon Jul 19 21:06:45 2021 +0800
v2.9美颜

输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。

添加Tag

1
2
$ git tag <tagname>
$ git tag <tagname> -m "messsage"

删除Tag

1
2
$ git tag -d <tagname> #删除本地标签
$ git push origin --delete <tagname> #删除远程标签

发布标签:

1
2
3
$ git push origin v1.0  #将v1.0tag推送到远程仓库

$ git push origin --tags #将把所有不在远程仓库的标签全部推上去

repo 使用说明

1.安装(推荐使用清华镜像版本)

1
2
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo

2.初始化

1
2
3
4
repo init –u URL [OPTIONS]

#eg:
repo init -u ssh://brooks@gerrit.office.cn:1000/platform/manifest.git

3.下载代码

1
repo sync [project name] #同步代码到本地

4.代码修改,上传

1
2
3
4
5
6
git add .
git commit -s //进入提交日志编辑页面,编辑保存后退出
repo upload . //执行upload操作将代码提交到Gerrit以便进行审核

#避免一次review有多笔提交 可以使用 commit --amend将最新的改动合并到上一笔的提交
git commit --amend

5.创建并切换分支

1
repo start [branchName]

欢迎关注我的其它发布渠道