第三课:开发中常用的Git操作 (Terminal)

git-cheatsheet.sh

常用脚本:

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

10. Git hook检查commit-msg

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:记录号)
    $  git reset —hard  7a78888
    会将最新的3次提交全部重置,就像没有提交过一样
    
    $  git reset --hard HEAD~3

4.2 是撤销本次操作,此次操作之前的commit都会被保留

$  git revert
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值