常用脚本:
21. 在现有remote repo上创建空分支
git checkout --orphan empty-branch
git rm -rf .
git commit --allow-empty -m "root commit"
git push origin empty-branch
20. gst == git status
gst
19. 将master分支合并到develop分支
譬如:在master加了PULL_REQUEST_TEMPLATE.md,需要同步回develop分支,下面是在vs code上操作步骤。
git checkout master
git pull
git checkout develop
git merge master
# if you need to abort the merge, you can use the following shell script
# git merge --abort
git add .
git commit -m 'merge master'
git push
18. git diff
# 查看本地demo分支与远程development分支差异 (仅仅显示文件名及状态)
git --no-pager diff --name-status demo origin/development
17. git撤销已经push的commit - 回滚到先前版本
例子:假如release上刚push了一个提交,这时想回滚到上一个版本
# 1. 查看commit id历史记录
git log
# commit ddbf1c28c12b8a633e8f80936450a609a297223c (HEAD -> release, origin/release)
# Author: yan xu <yan.xu@test.com>
# Date: Mon Feb 28 17:30:35 2022 +0800
# adjust cicd pipeline for uat installation
# commit f3b53b7eec4913c17991be243812b039a10397fc
# Author: yan xu <yan.xu@test.com>
# Date: Mon Feb 28 16:10:56 2022 +0800
# add limitation on README.md
# 2. 复制本次提交的前一个commit id,如f3b53b7eec4913c17991be243812b039a10397fc
# 3. 使用#2复制的commit id执行reset命令
git reset f3b53b7eec4913c17991be243812b039a10397fc --hard
# 4. 使用push命令回滚到上一次提交版本
git push origin release --force
16. 多开发分支合并到master:
例子:搭建unlocked pkg with circleci pipeline时,我们创建了2个分支管理pkg,base branch和pkg1 branch。当base和pkg1开发完后,我们想合并到master分支。
# 1 checkout到master分支并拉取最新代码
git checkout master
git pull
# 2 先合并base分支,发现没冲突
git merge base
git push
# 3 再合并pkg1分支,发现冲突
git merge pkg1
git push # 提示冲突
# 这时可在vs code本地release上修改以合并冲突,然后stage 修改后的结果
git push # 成功合并后上传
15. 撤销 git reset --hard HEAD~1:
方法一:
1.先通过git reflog找到上一次的历史提交记录id,git如果没有特意设置,是会保存记录一段时间的(a few days or a month)
2.git reset --hard [id]
方法二:
git reset --hard HEAD@{1}
直接回到刚才的那个结点,{}中表示的是结点的序号
14. 撤销当前commit -> 在commit被push前,可以使用下面方式撤销:
# 撤销最后一次commit,注:使用后若本地修改被覆盖,参考#15解决
git reset --hard HEAD^
# 撤销最后n次commit,如 (n=3)
git reset --hard HEAD~n
# 撤销指定commit
git reset <commit_id>
当然,如果想从staged commit -> changes, 也可使用`git rest`. i.e. 修改source后,输入了git add .命令,此时想撤回。
13. 对指定的提交修改author信息 | 参考
补充#2截图:
效果对比:
操作前:
操作后:
12. 有a,b两分支,代码都需对同一个文件c修改,这时我的a分支的改动还在本地,想把同事在b分支上对c文件的修改拉下来,然后再把自己本地对c文件的修改加上去:
# b分支对c的改动已经提交,提交id为comment_id
# 对于a分支,想把b对c的改动拉下来再继续未完成工作可以这样:
# 1. 缓存本地代码到暂存区
git stash
# 拉取remote所有branch的最新代码
git pull -r
git checkout b
# 通过此方式找到commit_id
git log
# 切回自己的分支
git checkout a
# cherry-pick
git cherry-pick commit_id
# 这两步骤可以不要
# git push
# git pull --rebase
# 2. 将暂存区代码恢复到本地
git stash pop
注意:关于使用IDE(如IntelliJ IDEA)非CLI方式cherry-pick时,对于多次提交建议按照时间顺序从早期的开始依此单个单个做cherry-pick(如果能确保目标card的提交是连续的,不参杂其他人的提交,便可以全选后点一次cherry-pick)。
11. 拉取private repo方法:
场景说明:公司电脑关联了team的github账号,想将个人账号的private repo拉下开发。
其他说明:创建一个fodder后,通过下面命令关联了个人账号。
git config user.email "<email>"
git config user.name "<username>"
git config user.password "<password>"
拉取步骤:
a. github前往personal access tokens页面,产生新token
b. 使用下面cli拉取私有repo代码
git clone https://<token>@github.com/<owner>/<repo>.git
其他命令:
# 列举git配置
git config --list
git config --local --list
git config --global --list
git config -- system --list
# 查看user.email
git config user.email
9. 强制覆盖远程分支
# 强制代码覆盖:远程pro -> 远程dev
git checkout pro
git pull
# git push -f <remote> <branch>
git push -f origin dev
8. 列出所有分支 + 拉取所以远程分支到本地
# 列出本地分支
git branch
# 列出远程分支
git branch -r
# 拉取所有远程分支到本地
git pull -r
7. cherry-pick
git cherry-pick <commit id>
# i.e. git cherry-pick 58fdb650d1fd1deed953984ce4e58090521d7eff
6. 查看提交记录 获取commit id
# 查看提交记录
git log --pretty=oneline
# 查看后输入q退出
5. 回滚操作
# 回滚commit过但未push的文件
git reset HEAD^
git reset --hard HEAD^
# 把修改的文件回滚到修改之前:
# 前提是该文件不是新增文件,并且没有提交(commit)
git checkout -- README.md
# 回滚多个文件
git checkout HEAD -- README.md config.json
# 回滚指定提交
git reset <commit id> --hard
# i.e. git reset db56454fead1f4a8e51f29471e0a783eb1ae2661 --hard
git 参数 | 命令执行后 |
---|---|
有--hard | 文件是最新状态 |
没有--hard | 文件是修改未 commit 的状态,即修改内容不会丢失 |
4. 删除分支
# 删除远程分支
git push origin --delete dev
# 删除远程分支之后,解除本地与远程分支关联
git branch --unset-upstream
# 删除本地分支
git branch -d dev
# 或者运行
git branch -D dev
3. 从master copy并创建dev分支
# 切换到master,并从远端拉取最新版本
git checkout master
git pull
# 从master创建本地dev分支,并切换到本地dev分支
git checkout -b dev
# 把新建的分支push到远端
git push origin dev
# 关联本地及远程dev分支
git branch --set-upstream-to=origin/dev
# 从远程dev分支拉取代码到本地dev分支
git pull
2. 拉取指定分支代码 + 从某次提交创建新分支
# 拉取指定分支代码
git clone -b <branch-name> url
# i.e. git clone -b dev https://github.com/project/repo.git
# 从某次提交创建新分支
git checkout -b qa c9b5ad1cc43b0cbf230a7a1d6054dfdc8c0c5c88
# Switched to a new branch 'qa'
1. dev合并到master分支
# 1. dev分支 - 提交代码
git add .
git commit -m 'dev'
git push -u origin dev
#2. master分支 - 切回master分支,拉取最新代码,合并
git checkout master
git pull origin master
git merge dev
#3. master分支 - 查看状态,push到远程服务器
git status
git push origin master
一、从命令行创建一个新的仓库
1.1 create a new repository on the command line
-
1.1.1 创建README.md文件
$ echo "# Technical-training-exchange" >> README.md 或 touch README.md
-
1.1.2 初始化Git
$ git init
-
1.1.3增加README.md文件
$ git add README.md
-
1.1.4 提交项目到本地Git
$ git commit -m "first commit"
-
1.1.5 关联远程的Git
$ git remote add origin https://github.com/iwevonn/Technical-training-exchange.git
-
1.1.6 将本地Git更新到远程的Git
$ git push -u origin master
1.2 push an existing repository from the command line
-
1.2.1 关联远程的Git
$ git remote add origin https://github.com/iwevonn/Technical-training-exchange.git
-
1.2.2 将本地Git更新到远程的Git
$ git push -u origin master
二、在现有的Git中开发
2.1 获取远程的代码仓库
$ git clone https://github.com/iwevonn/Technical-training-exchange.git
2.2 查看所有已存在的分支(-a :详情,可以不输入)
$ git branch [-a]
2.3 拉取远程的一个分支,并会在本地创建一个分支和远程的分支匹配
$ git fetch origin <分支名>:<分支名>
2.4 切换分支
$ git checkout <分支名>
2.5 获取最新的代码
$ git pull
2.6 代码提交到本地
$ git commit -a -m “second commit"
2.7 代码提提交到远程,如果没有成功就需要pull一次之后再提交到远程
$ git push origin <分支名>
2.8 在本地创建一个分支然后push到远程
- 2.8.1 创建本地分支:
$ git checkout -b <分支名>
- 2.8.2 创建完成后直接push :
$ git push -u origin <分支名>
2.9 更改git lg文字/字体显示样式
$ 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进行分支管理
3.1 新建一个分支
- 3.1.1 在本地电脑新建一个分支:
$ git branch <分支名>
- 3.1.2 将新分支发布在远程的代码仓上:
$ git push origin <分支名>
- 3.1.3 切换到你的新分支:
$ git checkout <分支名>
- 3.1.4 查看所有已存在的分支,你可以使用:
$ git branch
3.2 切换分支
$ git checkout <分支名>
3.3 分支合并 (将开发中其它的分支合并到稳定master主分支)
- 3.3.1 首先切换的master分支:
$ git checkout master
- 3.3.2 然后执行合并操作:
$ git merge <分支名>
- 3.3.3 如果有冲突,会提示你,查看冲突文件调用
$ git status
- 3.3.4 解决冲突,将解决后的文件暂存,然后调用
$ git add 或 $ git rm
- 3.3.5 所有冲突解决后,提交更改
$ git commit -m -a "commit info"。
3.4 分支衍合 (将开发中其它的分支,衍合到稳定master主分支) 分支衍合和分支合并的差别在于,分支衍合不会保留合并的日志,不留痕迹,而分支合并则会保留合并的日志。
- 3.4.1 首先切换到master分支:
$ git checkout master
- 3.4.2 然后执行衍和操作:
$ git rebase <分支名>
- 3.4.3 如果有冲突,会提示你,查看冲突文件调用
$ git status
- 3.4.4 解决冲突,将解决后的文件暂存,然后调用
$ git add 或 git rm
- 3.4.5 所有冲突解决后,提交更改
$ git rebase --continue
3.5 删除分支
- 3.5.1 执行
$ git branch -D <分支名>
- 3.5.2 删除该远程分支(冒号前面的空格不能少,原理是把一个空分支push到server上)
$ git push origin :<分支名>
- 3.5.3 如果该分支没有合并到主分支会报错,可以用以下命令强制删除
$ git branch -D <分支名>
3.6 从远程获取最新版本到本地(相当于是,不会自动merge)
$ git fetch <分支名>
3.7 为你的分支加入一个新的远程端:
$ git remote add <远程端名字> <地址>
四、回滚代码
4.1 撤销某次提交,但是此次之后的修改都会被退回到暂存区
$ git reset
- Example 直接回滚到固定版本号 (7a78888:记录号)
会将最新的3次提交全部重置,就像没有提交过一样$ git reset —hard 7a78888
$ git reset --hard HEAD~3
4.2 是撤销本次操作,此次操作之前的commit都会被保留
$ git revert