Git命令操作【全系列】

Git常用命令操作

1 基础命令

①git config --global user.name [‘你的用户名’]:查看/设置

git config --global user.name ziyi:设置用户名为ziyi
git config --global user.name:查看用户名

②git config --global user.email [‘你的邮箱’]:查看/设置

设置邮箱

③git reset HEAD test.txt 取消已经缓存的内容

取消test.txt已经缓存的内容

④git rm --cached <file> 将文件从暂存区删除
⑤git branch 相关命令
git branch (-a): 查看(所有)分支

git branch -r :查看远程分支

git branch <branchName> :创建本地分支

也可以通过:git checkout -b dev 本地创建dev分支

git push origin dev:dev:创建远程分支

git push <远程主机名> <本地分支名>:<远程分支名>

git branch -vv:查看本地分支与远程分支对应关系

在这里插入图片描述

查看本地分支+上次提交的信息+本地和远程分支的关系,如果本地分支没有和任何远程分支建立追踪关系,那么就不显示。

  • 如果要建立关系:
  • git branch --set-upstream-to=origin/dev dev
git branch --set-upstream-to=origin/dev dev:本地分支与远程分支建立关系

将本地dev与origin/dev(远程)建立联系

git checkout <branchName>:切换分支
git merge <branchName>: 将branchName内容合并到当前分支
git branch -d <branchName>:删除分支
git checkout -b dev-local origin/dev:拉取远端的开发分支并在本地建立一个dev-local分支与其对应

git checkout -b dev origin/dev

如果我们此时远程没有origin/dev ,我们想从main分支拉一个新的分支出来:

  1. git checkout -b dev origin/main # 基于main分支新建一个分支
  2. git push origin dev:dev # 创建远程dev分支
  3. git branch -vv # 查看本地dev分支与远程分支对应关系,如果对应关系不为origin/dev,执行下面命令建立关系:
    git branch --set-upstream-to=origin/dev dev
  • 如果出现报错:fatal: cannot set up tracking information; starting point ‘origin/main’ is not a branch
  • 可能您的 origin 远程设置为仅获取某些分支。
  • 解决办法:git remote set-branches --add origin main
⑥git log相关命令
git show --raw:查看最后一次提交记录的修改文件信息
git show --raw commit_id:指定commit_id对应修改文件列表
git log --stat:查看所有提交记录的修改文件信息
git log 文件名:查看某个文件的历史提交信息
git log --author=ziyi:查看指定author的修改信息
git log --pretty=oneline:查看所有修改相关的commitID和修改文件信息
git log -graph:查看历史中什么时候出现分支、合并
git log --reverse:逆向输出日志
git log --author=ziyi --online -5:简洁版本查看ziyi最近的五次提交
⑦git tag相关命令
git tag:查看所有标签
git tag -a -m “某某标签”:打标签
⑧git reset --soft <commit>:回退版本
  1. git reset --soft <commit>: 回退到指定 commit,保留修改内容,并将这些修改放在暂存区。
  2. git reset --mixed <commit>: 回退到指定 commit,保留修改内容,但将这些修改放在工作目录。
  3. git reset --hard <commit>: 回退到指定 commit,删除所有修改内容,包括暂存区和工作目录中的修改。

需要注意的是,reset --soft指定commit号,会将该commit到最近一次commit的所有修改内容全部回到暂存区,而不是只针对该commit。

# 例如:commit记录有c、b、a
commit cfasfas
commit bfadsfs
commit afasdfa
#此时我们reset到a,那么我们的HEAD就会到a,而b、c的修改内容都回到暂存区
⑨git merge --abort:放弃本次合并

本地解决冲突完成之后

  • git status:查看状态
  • git commit -m “xxx”:提交信息
  • git push:推送到远程

2 进阶命令

2.1 fork别人仓库并同步保持更新

  1. 把fork的项目克隆到本地仓库中
  2. Configuring a remote for a fork
  3. Syncing a fork

例如:我fork了一份https://github.com/simplezhli/flutter_deer.git(下文叫做A)到我自己的仓库(下文叫做B)

①git clone B(自己的仓库)
git clone 我自己fork的大佬的项目的GitHub地址
②git remote add/remove upstream A仓库地址
# 查看当前仓库的远程状态
git remote -v
# 被本地仓库添加一个将被同步给 fork 远程的上游仓库
git remote add upstream https://github.com/simplezhli/flutter_deer.git【A仓库地址】
# 这里后面的那个地址就是你fork的项目的源地址
# 如果upstream的地址设置错了,可以执行下面命令删除upstream
git remote remove upstream

下面会多出两个upstream,说明第二步已经成功了。这就相当于有一个管道在源项目和你fork的项目之间建立了,下面看看如何通信更新。

③同步fork(拉取远程fetch,然后合并到本地)
# 从upstream拉取信息
git fetch upstream [分支名]
# 切换到本地主分支
git checkout master
# 把 upstream/master 分支合并到本地 master 上,这样就完成了同步,并且不会丢掉本地修改的内容。
git merge upstream/master
# 这样,就把源项目同步更新到你的本地仓库中了。 如果再想更新到远程仓库fork(B),只需要:
git push origin master
实操效果图:

在这里插入图片描述

2.2 多个commit合并为1个

一般来说,开源社区提交pr都是需要合并为一个commit的

  1. 比如,我现在有4个commit:
85d5d8fa468b06bb9a62fafde01d80cbb7396682 # 我改的

621ca4121f971d9604e395556763551427d799d9 # 我改的

f744d2e91916ab7831f3a7695d1d1825916db164 # 我改的

5c135e49e683563fa470d7f5c281050ec1d73af9 # 我改的

295ac3b842b4ecb6eff1c9954a281a4606a8bc84 # 别人改的
  1. 我现在想把我提交的commit合并为1个
8403afe13664d6bb7f5a5557716a030e9389a944 # 我改的

295ac3b842b4ecb6eff1c9954a281a4606a8bc84 # 别人改的
  1. 具体操作方法
2.2.1 方法一:合并commitID

先从版本库回退内容到暂存区,再重新提交工作区的内容

  • 思路:使用 git reset --soft 回退版本库和暂存区的版本,同时保留工作区的变动,之后再重新提交工作区的内容就好了。
# 查看前10个commit【找到别人最后一次提交的位置】
git log -10
# 从版本库恢复文件到暂存区,不改动工作区的内容
git reset --soft 295ac3b842b4ecb6eff1c9954a281a4606a8bc84	# 别人改的commitID
# add已经跟踪的文件
git add -u
# 提交
git commit -m "修改信息"
# 强制push以替换远程仓的commitID
git push --force

如果push失败,出现Reject,则需要开启分支强制合入的选项,取消分支保护。

  • Settings -> Repository -> Protected Branches -> Protected branch (找到分支) -> Unprotect
2.2.2 方法二:git rebase
# 查看前10个commit
git log -10
# 将4个commit压缩成一个commit
git rebase -i HEAD~4	
# add已经跟踪的文件
git add -u
# 提交
git commit -m "修改信息"
# 强制push以替换远程仓的commitID
git push --force

注意:git rebase临时创建一个新分支进行,如果弄着出错了,可以 git checkout 原分支名 切换回原分支之后重新 git rebase。

git rebase具体演示:

我想合并前四个 commit 到最后一个。如下所示:

①git log 查看历史提交信息
在这里插入图片描述
②git rebase -i HEAD~n

使用 git rebase -i HEAD~5 压缩5个commit为1个,或者git rebase -i 51efaef517abdbf674478de6073c12239d78a56a (第一个commit的id)

vim编辑器,按i编辑,将后4个commit的pick修改为fixup,保留第一个pick。按esc键,输入:wq保存退出。

  • pick:使用commit。

  • reword:使用commit,修改commit信息。

  • squash:使用commit,将commit信息合入上一个commit。

  • fixup:使用commit,丢弃commit信息。
    在这里插入图片描述
    操作完之后,发现commit都合并成了一个。
    在这里插入图片描述
    ③git push --force 提交
    在这里插入图片描述

3 必备命令

3.1 git remote相关

git remote add [alias] [url]:添加远程仓库
git remote rm [alias]:删除远程仓库

3.2 git fetch相关【拉取最新代码不合并】

git fetch test:从远程仓库test中fetch【有多个远程仓库则指定名字】

如果本地git添加了多个远程仓库,则指定远程仓库名字

3.3 git pull【拉取最新代码并合并】

git pull origin 1.5.000:从origin拉取1.5.000分支

git pull = git fetch + git merge

3.4 git push

git push [alias] [branch] :推送到指定仓库的指定分支

3.5 git rebase

git rebase --continue:继续执行rebase
git rebase --abort:放弃本次rebase
git rebase --skip:跳过本次commit(多个commit合并为一个)

3.6 git cherry-pick commit_hash:应用指定分支提交

  • 假设我们正在开发一个新功能,但是在开发过程中,发现另一个分支上的某个提交对我们的新功能也非常有用。但是我们不想将其整个分支合并到当前的分支上,只想选择性地将该提交应用到我们的分支上。这时,就可以使用git cherry-pick命令来实现。

比如:我现在在main修改了tool.go,并且提交到了本地。此时我需要发布1.5.000的版本,并且我需要将我main分支上修改的commit应用到1.5.000的分支上。

# 切到main,修改main分支上的代码,然后提交到本地
git checkout main
git commit -m "xxxx"
# git log -n 1 查看对应hash值,例:9ad702aa23664
#此时我们想要将该提交应用到1.5.000的分支上
# 切换到1.5.000的分支上,然后cherry-pick该提交,最后推送到1.5.000远端
git chekout 1.5.000
git cherry-pick 9ad702aa23664
git push
  • git cherry-pick <commit_hash>,将 <commit_hash> 替换为您想要应用的本地提交的实际哈希值。如果您想要应用多个提交,可以指定多个<commit_hash>。
    • cherry-pick会产生新的commit
  • 如果发生冲突:
    • 解决冲突之后,将冲突文件重新添加,并执行 git cherry-pick --continue命令,继续cherry-pick
    • git add <conflicted_files>
      git cherry-pick --continue
  • git push <remote_name> <remote_branch>:将应用提交到远程
①git cherry-pick commit1 commit2:一次应用多个提交
②git cherry-pick commit1^…commit2:应用commit区间
③git cherry-pick代码冲突如何解决
  • 在cherry-pic多个commit时,可能会遇到代码冲突,这时cherry-pick会停下来,让用户决定如何继续操作。
    在这里插入图片描述

还是在feature分支上,现在需要把c、d、e都复制到master分支上:

  1. 先把起点c和终点e的commitHash都记录下来。

在这里插入图片描述

  1. 切换到master分支上,使用区间cherry-pick可以看到c被成功复制,当进行到d时,发现代码冲突,cherry-pick被中断了,这时需要解决代码冲突,重新提交到暂存区。

在这里插入图片描述

  1. 然后使用cherry-pick --continue让cherry-pick继续进行下去,最后e也被复制进来,整个流程就完成了。

以上就是解决cherry-pick冲突的完整流程。

④git cherry-pick --abort:放弃cherry-pick

回到cherry-pick操作前的样子,就像什么都没发生过

⑤git cherry-pick --quit:保留已经成功的commit,然后退出cherry-pick

不回到操作前的样子,保留已经cherry-pick成功的commit,并退出cherry-pick流程。

3.7 git stash命令

有时我们在feature分支开发新需求时,突然被告知有线上bug,必须马上修复。而此时我们的功能刚好开发到一半,于是我们就必须要重新拉取正式版本的代码到本地,查看问题并修复。

  • 但如果我们本地的代码(我们功能刚好开发到一半)和线上代码冲突了,此时就可以使用git stash暂存代码了。
①git stash save “备注内容”:保存当前未commit代码
②git stash list:列出所有stash记录
③git stash apply:应用最近一次的stash
④git stash apply stash@{对应数}:应用指定stash
# 先列出所有记录
git stash list
# 然后会看到如下记录
stash@{0}:WIP on...
stash@{1}:WIP on...
stash@{2}:On...
# 应用第二条stash记录
git stash apply stash@{1}

pop、drop同理。

④git stash clear:删除所有stash记录
⑤git stash drop:删除最近一次的stash

3.8 git revert命令

①git revert commit_hash:撤销自己的commit

有一天测试突然给你说,你开发上线的功能有问题,需要马上撤回,否则会影响到系统使用。这时你可能会想到用reset回退,可是你看了看分支上最新的提交有其他同事的代码,用reset会把这部分代码也撤回了。

  • 这个时候就需要用到git revert
  1. 找到自己提交的有bug的commit

现在master记录如下:

# 查看最近3次提交,记录自己的commit
git log -n 3 

在这里插入图片描述
2. git revert commitHash撤回提交

# 使用revert关掉自己的commit
git revert 21dcxxxx
  1. 编辑提交信息
    在这里插入图片描述

因为revert会生成一条新的提交记录,这时会让你编辑提交信息,编辑完后:wq保存退出就好

在这里插入图片描述
再来看下最新的log,生成了一条revert记录,虽然自己之前的提交记录还会保留着,但是你修改的代码内容已经被撤回了。

3.9 git reflog:查看历史记录

应用场景:某天你眼花,发现自己在其他人分支提交了代码还推到远程分支,这时因为分支只有你的最新提交,就想着使用reset --hard,结果紧张不小心记错了 commitHash,reset 过头,把同事的 commit 搞没了。没办法,reset --hard是强制回退的,找不到 commitHash 了,只能让同事从本地分支再推一次(同事瞬间拳头就硬了,怎么又是你)。于是,你的技术形象又一落千丈。

  1. 分支记录如下:我们想要reset到b
    在这里插入图片描述
  2. 但是由于我们的误操作,reset过头,b没了,最新的只剩a了
    在这里插入图片描述
  3. 这时,就需要使用git reflog查看历史记录,把错误提交的那次commitHash记下来。
    在这里插入图片描述
  4. 记录下误操作的commitHash之后,再reset回去,就会发现b回来了

在这里插入图片描述

3.10 git diff 命令

①git diff:查看工作区与暂存区所有文件差异
②git diff 文件名(可多个文件,空格分割):查看某个文件在工作区与暂存区差异
③git diff --cached:查看暂存区与上一次提交的差异
④git diff --cached commitID:查看暂存区与指定版本之间的所有文件差异
⑤git diff --cached 文件名1 文件名2…:查看暂存区与HEAD之间文件差异
⑥git diff --cached 版本号 文件名(多个,空格分割)
# 查看暂存区的Register.vue与9c32de8b9c84b8edbcbd615e7662316008e7b5dc版本中的Register.vue的区别
git diff --cached 9c32de8b9c84b8edbcbd615e7662316008e7b5dc  src/pages/Register.vue

实战:

1 提交pr
# 将fork出来的仓库clone到本地(自己的仓库)
git clone git@github.com:xxxxx/local.git
# 查看仓库情况
git remote -v 
# 添加自己fork的那个仓库(公司的仓库地址)
git remote add upstream git@github.xxxxx/company.git

# 从upstream/main分支上新建一个upstream-local本地分支,并切换到该分支
git checkout -b upstream-local upstream/main

# 将upsream/main分支上的提交rebase(同步)到本地
git fetch upstream
git rebase upstream/main
 
 # 将本地提交push到远程,然后我们就可以在github的upstream-loca分支上提交pr了
 git push --set-upstream origin
2 git reflog:恢复自己rollback掉的文件

git不小心将已经提交的记录rollback了,恢复步骤:
演示:本地修改了一个文件, 然后commit到本地

在这里插入图片描述

#查看提交记录
git log -n 5 --oneline

在这里插入图片描述

这个时候由于某些原因,我需要reset分支,然后将本地修改合并为1个

git reset --soft commitID
# 查看要reset的commitId
# git log -n 5 --oneline
# reset到指定位置
# git reset --soft 40359bc0c1b630a88d1e1aaaac1ae71999085059 

# 查看最近5次提交记录,发现之前的commit已经不存在了,成功reset到了4039xx的记录
# git log -n 5 --oneline

在这里插入图片描述
在这里插入图片描述
这个时候意外发生了,由于我们这常年的风湿老手,导致点错了,点成了rollback,丢失了我们本地的提交
在这里插入图片描述
我们不小心丢失了我们本地的提交:
在这里插入图片描述

不要慌不要急,补救措施来了,神级命令:reflog

在这里插入图片描述

这个时候我们要撤销我们的rollback操作,直接找到rollback的前一个commitId(为61xxx)

git reset --hard 61a10660

在这里插入图片描述

tips:

设置git短命令(alias)

对于喜欢敲命令的程序员来说,设置alias可以很好提高工作效率

方式一:

# 将push设置为ps
git config --global alias.ps push

方式二:

# 打开全局配置文件
vim ~/.gitconfig

# 写入如下内容
[alias]
	co = checkout
	ps = push
	pl = pull
	mer = merge --no-ff
	cp = cherry-pick

git merge --no-ff

  • 由于–no-ff选项参数会产生合并提交,因此可以在提交历史中清晰地看到每次合并的情况,这样可以更容易地追溯每次合并的来源,以及跟踪问题和进行代码审核等。

参考:https://www.jianshu.com/p/021bb953ee8d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值