git 常用操作

2022/5/1 git

# git修改远程仓库地址

git remote -v 查看关联远程仓库地址

git remote set-url origin 新的地址 修改远程仓库地址

git remote -v 查看是否修改成功

# git clone 远程仓库的某个分支/tag

git clone -b 分支名/tag xxx.git

# 添加远程仓库地址

git remote add upstream ssh://主仓库地址
1

# git tag

# 创建tag
git tag <tag_name> 
git tag -a <tag_name> -m "message"
# 为特定的commit创建tag
git tag <tag_name> <commit_sha>
# tag 推送指定版本到远程版本库
git push origin <tag_name>
# tag 推送到远程版本库
git push --tags
git push origin <branch> --tags
# 查看tag
git tag
git tag -l "1.0*"
# 获取标签的详细信息
git show <tag_name>
# 删除tag
git tag -d <tag_name>
# 删除远程仓库的tag
git push origin :refs/tags/<tag_name>
# 将远程仓库的标签拉取(同步)到当前分支
git fetch --tags
# 切换tag
git checkout <tag_name>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 远程分支改变,如何同步本地?

git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
1
2
3
4

# git强制提交本地代码到远程

git init
git remote add origin 远程仓库地址
git add . 
git commit -m “添加注释信息"
#强制提交
git push -u origin master -f 
1
2
3
4
5
6

# 版本回退

#查看历史提交日志
git log  
git log --pretty=oneline
#查看历史命令
git reflog
#回退指定版本
git reset --hard commit_id
##HEAD代表当前版本,一个^代表向上回退一个版本
git reset --hard HEAD^
1
2
3
4
5
6
7
8
9

# 中文乱码问题

# git status 乱码
git config --global core.quotepath false

#git commit 乱码
git config --global i18n.commitencoding utf-8

#git status 乱码
git config --global i18n.logoutputencoding utf-8
1
2
3
4
5
6
7
8

注意:如果是Linux系统,需要设置环境变量 export LESSCHARSET=utf-8

Git for windows 中文乱码解决方案 (opens new window)

# git在.gitignore添加忽略文件不起作用

git rm -r --cached .
1

重新addcommit即可解决

# 多分支合并代码

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。

这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。

## 得到最新一次提交的commitHash(类似5b6612d84a7f401f4519b73f38348bc094ba5501)
git log -n1 --format=format:"%H"
## 可以查看所有的提交信息
git log
## Cherry pick 支持一次转移多个提交
git cherry-pick <HashA> <HashB>
1
2
3
4
5
6

参看:git cherry-pick 教程(阮一峰的网络日志) (opens new window)

# merge 和 rebase

比如git pull这个命令,我们经常会用,它默认是使用merge方式将远端别人的修改拉到本地;如果带上上参数git pull -r,就会使用rebase的方式将远端修改拉到本地。

这二者最直观的区别就是:merge方式合并的分支会有很多「分叉」,而rebase方式合并的分支就是一条直线。

对于多人协作,merge方式并不好

那么问题来了,rebase是如何将两条不同的分支合并到同一条分支的呢:

image-20211220094646114

首先,找到这两条分支的最近公共祖先LCA,然后从master节点开始,重演LCAdev几个commit的修改,如果这些修改和LCAmastercommit有冲突,就会提示你手动解决冲突,最后的结果就是把dev的分支完全接到master上面。

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。

image-20211220110915080

在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

image-20211220111009074

但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

image-20211220111043121

解决冲突:

  • git rebase --continue:这样git会继续应用(apply)余下的补丁。
  • git rebase --abort:在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

对于使用 git merge 来合并所看到的commit的顺序(从新到旧)是: C7 , C6 , C4, C5 , C3 ,C2,C1 对于使用 git rebase 来合并所看到的commit的顺序(从新到旧)是: C7 , C6‘,C5' ,C4,C3, C2,C1

# git merge技巧

# 合并单个commit

首先,我们需要把A分支上提交的部分代码,放在B分支上

git checkout B  // 切换到B分支
git cherry-pick 43aea9af  // 把某一次的commit合并到B分支,其中’43aea9af‘是某次commit提交记录的ID
git push origin B  // 把分支B推送到远程仓库
1
2
3

# 合并连续的多个commit

果我们想要合并多个连续的commit,用上面的第一种方法,显然效率不高,可以使用一下方法: 比如我们再A分支上有43aea9af到70dfeec2a的连续的10个commit要合并到B分支上

首先基于A分支创建一个临时分支temp,并指明新分支的最后一个commit

git checkout -b temp 70dfeec2a
1

将temp分支上的从43aea9af到最后一个commit,也就是70dfeec2a的commit合并到B分支上

git rebase --into B 43aea9af^
1

# 多个commit合成一个

参看: 如何将git的多个commit合成一个了? (opens new window)

# 修改 commit -m 的备注信息
# 这时候就会弹出一个操作框需要会点基本的vim操作
git commit --amend

# 后续commit提交前操作
# --no-edit就是表示我们不修改了还是和前面那个提交同一个提交
git commit --amend --no-edit

# 后续commit已提交操作
git rebase -i HEAD~2
git rebase -i <版本号>
1
2
3
4
5
6
7
8
9
10
11