Git|详解|命令

Git命令 | 详解

概念

Git是基于树进行维护的,每一个节点都是一个历史版本,可以进行代码管理。

Git图示

工作区(Workspace) :就是会出现工作目录,即自己要编写的代码

暂存区(Index / Stage) :通过 git add 加进去的修改记录

本地仓库(Repository)

远程仓库(Remote)

配置Git命令

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

git config --list : 显示当前的Git配置

git config -e [--global] : 编辑Git配置文件

git config [--global] user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中

git config [--global] user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中

git config --global init.defaultBranch <defaultBranch>:配置初始默认的分支名

git init:将当前目录配置成 git 仓库,信息记录在隐藏的.git文件夹中

工作区

git status:显示有变更的文件

git add XX:将XX文件的 修改信息 添加到暂存区

git add .:将当前工作区的所有文件的修改信息加入暂存区

git rm [file1] [file2] ... : 删除工作区文件,并把这次删除加入到暂存区

git diff XX:查看XX文件相对于暂存区修改了哪些内容

暂存区

git rm --cached XX:将文件XX从暂存区中删掉,停止追踪指定文件,但该文件会保留在工作区

git restore --staged XXX : 将暂存区的XXX清空,工作区不变

git commit -m "给自己看的备注信息":将暂存区的内容提交到当前分支(可持久化)

git commit -am "给自己看的备注信息":不用执行 git add 操作,直接将当前工作区的修改提交到当前分支,即合并了 git add 操作

分支操作

  • 查看分支

git branch : 查看本地分支

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

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

  • 删除分支

git branch -d branch_name:删除本地的branch_name分支

git push origin --delete [branch-name] : 删除远程分支

  • 切换分支

git checkout branch_name:切换到branch_name这个分支

git checkout -b branch_name:创建并切换到branch_name这个分支

1 本地分支

git branch : 列出所有本地分支

git branch branch_name:创建新分支,但依然停留在当前分支

git checkout branch_name:切换到branch_name这个分支,并更新工作区

git checkout -b branch_name:创建并切换到branch_name这个分支

git branch -m oldBranchName newBranchName : 修改本地分支名字

git merge branch_name:将分支branch_name合并到当前分支上

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

git cherry-pick [commit] : 选择一个commit,合并进当前分支

git branch -d branch_name:删除本地仓库的branch_name分支

2 远程分支

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

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

git push origin --delete [branch-name] : 删除远程分支

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

3 本地和远程

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

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

git branch --set-upstream [branch] [remote-branch] : 建立追踪关系,在现有分支与指定的远程分支之间 (现在已经不支持)

git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应

日志信息查看

git log:查看当前分支的所有版本

git reflog:查看HEAD指针的移动历史(包括被回滚的版本)

git status : 显示当前工作区有变更的文件

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

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

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

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

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

git whatchanged [file] : 显示某个文件的版本历史,包括文件改名

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

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

git shortlog -sn : 显示所有提交过的用户,按提交次数排序

git blame [file] : 显示指定文件是什么人在什么时间修改过

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

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

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

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

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

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

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

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

远程同步

1 仓库关联

git remote -v : 查看与远程仓库的关联

git remote remove origin :删除与远程仓库的关联

git remote add origin git@github.com:xxx/XXX.git:将本地仓库关联到远程仓库

2 拉取&推送&克隆

2.1 拉取

git pull:将远程仓库的当前分支与本地仓库的当前分支合并

git pull origin branch_name:将远程仓库的 branch_name 分支与本地仓库的当前分支合并

git checkout -t origin/branch_name: 将远程的branch_name分支拉取到本地

2.2 推送

注意 push 操作会默认推送到和本地分支名相同的远程仓库的分支,如果远程仓库没有同名分支,会推送到默认分支。优先级:同名分支>默认分支。

如果推送到默认分支,你可能需要在远程进行merge操作了。

git push -u (第一次需要-u以后不需要):将当前分支推送到远程仓库

git push origin branch_name:将本地的某个分支推送到远程仓库

git push --set-upstream origin branch_name:将本地的branch_name分支推送到远程仓库的branch_name分支

如果远程没有 branch_name 分支,会自动创建该分支。

git push origin main:branch_name 命令类似,将 main 推送到 branch_name 分支,如果没有,便创建

git push -d origin branch_name:删除远程仓库的branch_name分支

2.3 克隆

下载下来就是一个仓库,无需进行 git init 操作。

git clone git@github.com:anda522/XXX.git:将远程仓库XXX下载到当前目录下

撤销回退

1 版本回退

1.1 硬回退

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

git reset --hard HEAD^git reset --hard HEAD~:将代码库回滚到上一个版本

git reset --hard HEAD^^:往上回滚两次,以此类推

git reset --hard HEAD~100:往上回滚100个版本

git reset --hard 版本号:回滚到某一特定版本

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

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

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

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

1.2 软回退

如果想要继续修改代码,撤回去再修改可以执行以下命令:

git reset --soft HEAD^:撤销上次的commit记录,仅仅撤回commit记录,代码仍然保留

如果想撤回两次commit,可以执行以下命令:

git reset --soft HEAD^2

此命令就是将commit记录撤销,工作区的内容不改变

2 stash操作

git stash:将工作区和暂存区中尚未提交的修改存入栈中

git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素

git stash drop:删除栈顶存储的修改

git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素

git stash list:查看栈中所有元素

3 恢复

git reset [file] : 重置暂存区的指定文件,取消追踪暂存区的file文件,与上一次commit保持一致,工作区不变,即取消 add 操作。

git checkout -- XXgit restore XX:将XX文件尚未加入暂存区的修改全部撤销,如果暂存区为空,恢复上一个版本对应的内容

git checkout [file] : 恢复暂存区的指定文件到工作区(工作区文件发生改变)

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

git checkout . : 恢复暂存区的所有文件到工作区,将暂存区所有的改变应用到工作区

git clean -f : 清除未追踪的文件修改操作

子模块

将此仓库(https://github.com/anda522/blogs.git)添加为对应的子模块,路径位于 path/submodule

git submodule add https://github.com/anda522/blogs.git path/submodule

在主项目目录中更新子模块的所有更改:

git submodule update --remote

或者在子模块目录中执行 git pull 命令。

指定子模块 xxx 进行更新:

git submodule update --remote xxx

Git rebase

应用其他分支的改变

在别人的分支基础上提交自己的改变。

  • 首先切换到自己的所在分支 git checkout feature
  • 执行 git rebase master 操作,以 master 分支为基础,拉取最新变动。

合并commit为一个

参考:https://juejin.cn/post/6844903600976576519

  • 切换到feature分支: git checkout feature

  • 希望将当前feature分支的最近3个commit合并为一个commit

    先执行: git rebase -i HEAD~3

-i 是交互式操作,会弹出一个编辑框,编辑框中内容有下面的注释

pick:保留该commit(缩写:p)

reword:保留该commit,但我需要修改该commit的注释(缩写:r)

edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s)

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)

弹出的编辑框内容大概为:

pick d2cf1f9 fix: 第一次提交
pick 47971f6 fix: 第二次提交
pick fb28c8d fix: 第三次提交

我们将其修改为下面内容,保存然后退出。

pick d2cf1f9 fix: 第一次提交
s 47971f6 fix: 第二次提交
s fb28c8d fix: 第三次提交

然后是注释编辑框自动弹出,我们修改注释内容保存退出即可。最后就能完成3个commit的合并。

序列化操作

1 基础上传操作

git add .
git commit -m "备注信息"
git push

2 新建仓库的初始化操作

  1. 远程新建仓库,默认不添加README.md文件
  2. 此时请注意远程仓库的主分支名为main还是master
  3. 本地新建一个文件夹用来作为上传该远程仓库的文件(或者用已存在的文件夹也行),在该目录下使用git init命令初始化仓库
  4. 将本地仓库主分支名字设为和远端一样,例如git branch -M main
  5. 关联远程仓库,例如git remote add origin https://github.com/anda522/bot.git
  6. 上传的操作:
git add .
git commit -m "提交代码的备注信息"
git push #(此代码一般会报错)

报错原因:新建仓库时默认仓库为空,此时没有任何分支,如果本地有分支需要上传到远程的相同的分支上,需要将远程新建一个分支进行push操作。

故代码可更新为:git push --set-upstream origin maingit push origin main:main

3 新建dev分支并上传

git checkout -b dev # 本地新建一个dev分支,并且切换到dev分支
git push --set-upstream origin dev # 本地在dev分支;需要上传在dev分支的操作;默认远端没有dev分支,远端将创建一个dev分支并进行push操作

4 删除久远的未被追踪的分支

有时候分支已经从远程分支中删除,但是本地分支并不知道当前这几个远程分支是否被删除,可以使用git remote show origin命令查看

git remote show origin #  会出现stale (use 'git remote prune' to remove)字样
# git branch -a 这个可以看到远程不存在的分支还能显示出来
git remote prune origin # 删除未被追踪的分支

5 打tag

  • 以本地最后一个commit创建tag
git tag <tagName> # 基于本地最后一个commit创建一个tag
git push origin <tagName> # 将tag推送到远程仓库
git push origin --tags # 将所有tag推送到远程仓库
  • 以特定的提交为tag
git log --pretty=oneline # 查看当前分支的提交历史 里面包含 commit id
git tag -a <tagName> <commitId>
  • 查看信息
git show <tagName> # 查看tag的详细信息
git tag # 查看本地所有tag
git ls-remote --tag origin # 查看远程tag
  • 删除tag
git tag -d <tagName> # 删除本地tag
git push origin :refs/tags/<tagName> # 删除远程tag
  • 其他
git tag -a <tagname> -m "XXX..." # 指定标签信息
git tag -a v1.0 -m "release 0.1.0 version"  # 创建附注标签
git checkout [tagname] # 切换标签

6 git fetch和git pull对比

  • git fetch:将远程更新信息全部取回本地
git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地

如果只想取回特定分支,可以指定分支名

git fetch <远程主机名> <分支名> //注意之间有空格

常见命令:

取回origin 主机的master 分支:

git fetch origin master

取回更新后会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:

git log -p FETCH_HEAD

可以看到返回的信息包括更新的文件名,更新的作者和时间,以及更新的代码。我们可以通过这些信息来判断是否产生冲突,以确定是否将更新merge到当前分支。


  • git pull:拉取并合并

可以理解为两个过程:

git fetch origin master //从远程主机的master分支拉取最新内容 
git merge FETCH_HEAD    //将拉取下来的最新内容合并到当前所在的分支中

完整命令:将远程主机的某个分支的更新取回,并与本地指定的分支合并

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

如果是与当前分支合并,则冒号后面的可以省略,例如:

git pull origin master

7 远程仓库名改动

需要进行仓库名改动,先改动了远程仓库名,本地目录名不变就行。

之后就要进行重新关联远程仓库,因为远程仓库名发生变化,仓库地址也就发生了变化。

git remote -v // 可以先查看与远程仓库的关联
git remote remove origin // 然后删除与远程仓库的关联
git remote add origin git@github.com:xxx/XXX.git // 将本地仓库关联到远程仓库

8 设置不同的fetch和push源

我希望拉取公共的大项目代码,然后自己进行修改,上传到我的个人仓库中。所以fetch源需要是非个人源,push源为个人仓库的源。

git remote set-url origin  git://g.csail.mit.edu/xv6-labs-2021
git remote set-url --add --push origin git@github.com:anda522/XV6-LAB.git

再用 git remote -v 命令可以查看已经修改完成。

origin git://g.csail.mit.edu/xv6-labs-2021 (push)
origin git@github.com:anda522/XV6-LAB.git (fetch)

然后就可以用下面代码进行操作了

git fetch
git push

9 撤回上次commit并重新进行更改

先撤回上次的commit记录:

git reset --soft HEAD^

commit记录消去以后,使用 git status 可以看到撤回的文件重新添加在暂存区,此时可以进行更改文件,然后再次 git add

修改文件完成后可以直接提交commit,如果要将此次的变更同步到远程仓库,要强制push

git push -f

CI/CD

自动对commit / merge的代码进行自动化测试。

参考

[1] 如何设置git代理:https://ericclose.github.io/git-proxy-config.html


   转载规则


《Git|详解|命令》 行码棋 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
docker常用命令总结 docker常用命令总结
将当前用户添加到docker用户组 为了避免每次使用docker命令都需要加上sudo权限,可以将当前用户加入安装中自动创建的docker用户组(可以参考官方文档): sudo usermod -aG docker $USER 执行完此操
2022-07-02 2024-05-03
下一篇 
ZZU2020物联期末回顾 ZZU2020物联期末回顾
本文知识点均为从网络或其他地方搜集整理而来,提到的习题均无答案,完全不具备权威性质,作者不对看本文造成的后果负责,请合理参考。 本人为ZZU2020级网安学院物联考生,以下是我对实际考试的考后记录,仅供复习参考。 2023-12-30 U
2022-06-29 2024-02-20
  目录