git 常用操作
# git修改远程仓库地址
git remote -v
查看关联远程仓库地址
git remote set-url origin 新的地址
修改远程仓库地址
git remote -v
查看是否修改成功
# git clone 远程仓库的某个分支/tag
git clone -b 分支名/tag xxx.git
# 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 --tags
git push origin <branch> --tags
# 查看tag
git tag
git tag -l "1.0*"
# 获取标签的详细信息
git show <tag_name>
# 删除tag
git tag -d <tag_name>
# 将远程仓库的标签拉取(同步)到当前分支
git fetch --tags
# 切换tag
git checkout <tag_name>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 远程分支改变,如何同步本地?
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
2
3
4
# git强制提交本地代码到远程
git init
git remote add origin 远程仓库地址
git add .
git commit -m “添加注释信息"
#强制提交
git push -u origin master -f
2
3
4
5
6
# 版本回退
#查看历史提交日志
git log
git log --pretty=oneline
#查看历史命令
git reflog
#回退指定版本
git reset --hard commit_id
##HEAD代表当前版本,一个^代表向上回退一个版本
git reset --hard HEAD^
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
2
3
4
5
6
7
8
注意:如果是Linux系统,需要设置环境变量 export LESSCHARSET=utf-8
Git for windows 中文乱码解决方案 (opens new window)
# git在.gitignore添加忽略文件不起作用
git rm -r --cached .
重新add
和commit
即可解决
# 多分支合并代码
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge
)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
## 得到最新一次提交的commitHash(类似5b6612d84a7f401f4519b73f38348bc094ba5501)
git log -n1 --format=format:"%H"
## 可以查看所有的提交信息
git log
## Cherry pick 支持一次转移多个提交
git cherry-pick <HashA> <HashB>
2
3
4
5
6
参看:git cherry-pick 教程(阮一峰的网络日志) (opens new window)
# merge 和 rebase
比如git pull
这个命令,我们经常会用,它默认是使用merge
方式将远端别人的修改拉到本地;如果带上上参数git pull -r
,就会使用rebase
的方式将远端修改拉到本地。
这二者最直观的区别就是:merge
方式合并的分支会有很多「分叉」,而rebase
方式合并的分支就是一条直线。
对于多人协作,merge
方式并不好。
那么问题来了,rebase
是如何将两条不同的分支合并到同一条分支的呢:
首先,找到这两条分支的最近公共祖先LCA
,然后从master
节点开始,重演LCA
到dev
几个commit
的修改,如果这些修改和LCA
到master
的commit
有冲突,就会提示你手动解决冲突,最后的结果就是把dev
的分支完全接到master
上面。
假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。
但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。
在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):
但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:
解决冲突:
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