git ---常用命令及问题整理


 
实践沙箱教程: https://learngitbranching.js.org/

一、Git分区

​   分布式版本控制系统,没有中央服务器,每个人的电脑都有一个完整的版本库

在这里插入图片描述

Workspace:工作区,即电脑上看到的目录

Index/Stage:暂存区,add命令就是把文件从工作区添加到暂存区

Respository:仓库区(本地仓库)

Remote:远程仓库

二、配置操作

1、显示当前配置

git config --list
扫描二维码关注公众号,回复: 14942642 查看本文章

2、编辑配置文件

git config -e [--global]

3、设置提交代码时的全局用户信息

git config --global user.email "[email protected]"
git config --global user.name "nobug"

三、本地常用操作

1、git init —创建版本库

  版本库即repository,即一个目录,工作区里的隐藏目录 .git,其中最重要的是存了暂存区(stage),【以及自动创建的第一个分支master,和指向master的一个指针HEAD】,目录中每个文件的修改、删除都能被git跟踪

# 创建一个版本库
git init

2、git add —提交文件到暂存区

# 提交目录里的test.txt到暂存区
git add test.txt

# 提交目录中所有文件到暂存区中
git add *

# 添加指定目录到暂存区,包括子目录
git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
git add -p

# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]

3、git commit —提交文件到仓库

把暂存区的所有内容提交到当前分支上

# 提交暂存区到仓库区
git commit -m [message]

# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a

# 提交时显示所有diff信息
git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

4、git status —查看文件提交情况

git status

5、git reset —撤销变化

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]
5.1 HEAD

HEAD 总是指向当前分支上最近一次提交记录, HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见

如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向

分离的头指针:

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:
HEAD -> main -> C1
HEAD 指向 main, main 指向 C1

git checkout C1 此时HEAD指向C1

# ^ 向上移动一个提交记录
# ~3 向上移动3个提交记录

git checkout bugFix^
可以直接使用 -f 选项让分支指向另一个提交
git branch -f main HEAD~3
5.2 利用HEAD进行reset
# 回退到上个版本,在reset后
git reset --hard HEAD^

# 回退到上上个版本,两个^
git reset --hard HEAD^^

# 回退到前100个版本
git reset --hard HEAD~100

# 恢复回退的版本,通过git reflog 找到对应版本号
git reset --hard 6fcfc89

6、git revert —远程分支回退

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]

7、git rebase —分支移动

我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。


在这里插入图片描述
在这里插入图片描述

新建并切换到 bugFix 分支
提交一次
切换回 main 分支再提交一次
再次切换到 bugFix 分支,rebase 到 main 上

git checkout -b bugFix 
git commit
git checkout main
git commit
git checkout bugFix
git rebase main
7.1 交互式rebase

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

git rebase -i HEAD~4

通过rebase -i,可以

  • 调整提交记录的顺序
  • 删除不想要的提交
  • 合并提交, 它允许你把多个提交记录合并成一个

8、git branch —新建分支

# 列出所有本地分支
git branch

# 列出所有远程分支
git branch -r

# 列出所有本地分支和远程分支
git branch -a

# 新建一个分支,但依然停留在当前分支
git branch [branch-name]

# 新建一个分支,指向指定commit
git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]

# 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]

# 删除本地分支
git branch -d [branch-name]

# 删除远程分支
git branch -dr [remote/branch]

# 设置远程追踪分支
# 下面命令设置foo分支追踪远程仓库分支origin/main
git branch -u origin/main foo

9、git checkout —切换分支

# 新建一个分支,并切换到该分支
git checkout -b [branch]

# 切换到指定分支,并更新工作区
git checkout [branch-name]

# 切换到上一个分支
git checkout -

# 新建一个分支,指向某个tag,(此时会进入头指针分离状态)
git checkout -b [branch] [tag]

# 新建空分支
git checkout --orphan null
git rm -rf .

# 恢复暂存区的指定文件到工作区
git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
git checkout .

# 设置远程追踪分支
# 下面命令设置foo追踪远程分支origin/main
git checkout -b foo origin/main

10、git cherry-pick —整理提交记录

#  将一些提交复制到当前所在的位置(`HEAD`)下面
git cherry-pick 30ab319f1c1544934b9b746b3f5e8cb7f301978b 45d1161d979e60167f4b2faceda2e9189218bce0

11、git merge —合并分支

# 合并指定分支到当前分支
git merge [branch-name]

# 通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息
# 使用参数 –no-ff来禁用”Fast forward”模式
git merge --no-ff -m "注释" [branch-name]

git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>[branch-name]是指[branch-name]上修改的内容

12、git stash —暂存工作区修改

# 隐藏当前工作现场
git stash

# 查看工作现场
git stash list

# 恢复现场
git stash pop

# 恢复指定现场,不指定则默认为最近一次的进度 git stash pop stash@{0}
git stash pop stash@{num}

# 恢复指定现场且可重复恢复
git stash apply stash@{num}

# 删除一条指定保存的工作进度
git stash drop stash@{num}

# 删除所有保存的工作进度
git stash clear

13、git tag —创建标签

# 列出所有tag
git tag

# 新建一个tag在当前commit
git tag [tag-name]

# 新建一个tag在指定commit(hash)
git tag [tag-name] [commit]

# 删除本地tag
git tag -d [tag]

# 删除远程tag
git push origin :refs/tags/[tagName]

# 查看tag信息
git show [tag]

# 提交指定tag
git push [remote] [tag]

# 提交所有tag
git push [remote] --tags

14、git log —查看操作记录

# 显示当前分支的版本历史
git log

# 显示当前分支的最近几次提交
git reflog

# 显示commit历史,以及每次commit发生变更的文件
git log --stat

# 搜索提交历史,根据关键词
git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
git log --follow [file]

# 显示指定文件相关的每一次diff
git log -p [file]

# 显示过去5次提交
git log -5 --pretty --oneline

四、远程仓库常用操作

1、git clone —下载远程仓库

# 根据url下载远程仓库
git clone https://github.com/wechatpay-apiv3/wechatpay-go.git

2、git fetch —下载远程仓库更新

# 下载远程仓库的所有变动
git fetch [remote]

# 只下载远程仓库指定分支bar
git fetch origin bar

# 下载远程仓库指定分支到本地不同名分支 [git fetch origin <source>:<destination>]
# 下载远程仓库bar分支到本地foo分支
git fetch origin bar:foo

# 下载空分支,会在本地创建一个新分支
git fetch origin :bugFix

3、git remote —查看远程仓库信息

# 显示所有远程仓库
git remote -v

# 显示某个远程仓库的信息
git remote show [remote]

# 增加一个新的远程仓库,并命名
git remote add [shortname] [url]

4、git pull —拉取远程仓库最新变化

git pull = git fetch+git merge

git pull --rebase = git fetch + git rebase

# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]

5、git push —推送本地变化到远程仓库

# 上传本地指定分支到远程仓库
git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force

# 推送所有分支到远程仓库
git push [remote] --all

# push 空 到远程仓库,会删除远程仓库中的分支
# 下面的操作会删除远程仓库中的side分支
git push origin :side

五、其他操作

1、git diff —查看文件差异

# 显示暂存区和工作区的差异
git diff

# 显示暂存区和上一个commit的差异
git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
git diff HEAD

# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]

# 显示今天写了多少行代码
git diff --shortstat "@{0 day ago}"

2、git show —查看文件内容变化

# 显示某次提交的元数据和内容变化
git show [commit]

# 显示某次提交发生变化的文件
git show --name-only [commit]

# 显示某次提交时,某个文件的内容
git show [commit]:[filename]

六、疑难杂症

1、修改之前分支的某次提交

如果之前在 A1 分支上进行了一次提交,然后又基于它创建了 B1 分支,然后又提交了一次。此时想对A1进行一些小小的调整,尽管A1提交记录并不是最新的了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K19nqEni-1650723439621)(git学习.assets/image-20220423212025172.png)]

解决方法一:

  1. 先用 git rebase -i 将提交重新排序,然后把想要修改的提交记录(A1)挪到最前
  2. 然后用 git commit --amend 来进行一些小修改
  3. 接着再用 git rebase -i 来将他们调回原来的顺序
  4. 最后把HEAD移到修改的最前端

解决方法二:

  1. git checkout main
  2. git cherry-pick A1
  3. git commit --amend
  4. git cherry-pick B1

(还有很多其他方法)

2、远程服务器拒绝直接push到master

因为策略配置要求 pull requests 来提交更新

解决方法:

  新建一个分支feature, 推送到远程服务器. 然后reset你的master分支和远程服务器保持一致

3、删除远程仓库的提交

方法一:

需要有对应分支的强制提交权限

# 回退到上一次提交
git reset HEAD^
# 强制提交
git push origin master -f

方法二:

需要有对应分支的强制提交权限

git log 查看需要删除哪次提交之后的提交

# 删除某次提交后的所有提交
git rebase -i 46257e257f416e75631b496c151bbbf1096be2a1
git push origin master -f

4、删除远程仓库分支

# push 空 到远程仓库,会删除远程仓库中的分支
# 下面的操作会删除远程仓库中的side分支
git push origin :side

5、恢复被删除的文件

5.1 add后但没有commit前
git checkout --b.txt

6、remote: error: cannot lock ref ‘refs/heads/devlop/fix‘: ‘refs/heads/devlop/fix‘ exists; cannot create ‘refs

  因为远程有一个devlop分支,然后本地又新创建了一个分支为devlop/fix,名字冲突了所以会有问题

解决方案

  修改分支名 git branch -m dev/fix

7、merge和rebase的优缺点比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6AxoSPIy-1650723439621)(git学习.assets/image-20220423175646467.png)]

 
 
如有不对,烦请指出,感谢~

猜你喜欢

转载自blog.csdn.net/my_miuye/article/details/124371617