Git 常用命令

一,获取git 仓库通常有两种方式:

​ 1,在本地初始化一个git仓库

​ 命令:git init

​ 执行命令后,在执行命令的路径下就会有一个隐藏文件夹.git,说明成功了

​ 2,从远程仓库克隆

​ git clone 网络地址

在这里插入图片描述

在执行名称后,会输入码云的账号,输入后会在你克隆的目录下就会出现远程仓库的代码了

3,git 工作目录,暂存区以及版本库的概念

​ 1,版本库:前面看到的.git 隐藏文件夹就是版本库,版本库中会存储很多配置信息,日志信息和文件版本信息

​ 2,工作目录(工作区):包含.git文件夹的目录就是工作目录,主要用于存放开发的代码

​ 3,暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage.暂存区是一个临时保存修改文件的地方

4,git 工作目录下文件的两种状态

​ 1,untracked 未跟踪(未被纳入版本控制)

​ 2,tracked 已跟踪(被纳入版本控制)

​ Unmodified 未修改状态

​ Modified 已修改状态

​ Staged 已暂存状态

5,本地仓库操作命令

​ git status 命令 可以查看文件的状态

​ git statua -s 更简洁

​ git add 文件名 将未跟踪状态的文件加到暂存区,就可以提交了

​ git reset 文件名 将已跟踪的文件改为未跟踪。

​ git commit 将暂存区文件修改提交到本地仓库

​ git commit -m “日志”

​ git rm 文件名 删除文件 ,删除的是工作区域和暂存区的文件,执行git commit 后本地仓库文件才会删除

​ 将文件添加至忽略列表

​ git log 查看日志记录

6,远程仓库操作

​ 1,查看远程仓库

​ git remote 查看远程仓库 只要是clone来的仓库,默认就是origin

​ git remote -v 查看详细的远程仓库信息

​ git remote show origin 也可以查看详细远程仓库信息

​ 2,添加远程仓库

​ 给在本地git init 创建的仓库 添加远程仓库地址,让本地仓库与远程仓库关联

​ 命令:

git remote add 名字 远程仓库地址

​ 3,从远程仓库克隆

​ 命令:git clone 远程仓库地址

​ 将远程仓库复制下来

​ 4,移除无效的远程仓库

​ 命令:git remote rm 名称(比如:origin)

​ 此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库。

​ 5,从远程仓库中抓取与拉取

​ 命令:git fetch

​ 是从远程仓库获取最新版本到本地仓库(.git 文件夹下的一个文件夹中),不会自动merge(合并)

​ 所以我们还要手动合并(merge),命令:git merge origin/master

​ 命令:git pull (或者 git pull origin/master)是从远程仓库获取最新版本并merge 到本地仓库

​ 注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,而且仓库中存在文件,此时再从远程仓库中拉取文件的时候会报错(fatal:refusing to merge unrelated histories ),解决此问题可以在git pull 命令后加入参数–allow-unrelated-histories

​ 6,推送到远程仓库

​ 当你想将自己本地代码推送到远程仓库中 时,命令:git push [remote-name] (比如:origin) [branch-name]

​ git commit -a -m “” 将在本地仓库的经过git 托管的已经修改的文件 直接提交,不用git add

7, 分支

​ 1,查看分支

​ 列出所有本地分支,命令:git branch.

​ 列出所有远程分支,命令:git branch -r

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

​ 2,创建分支

​ 创建本地分支,命令:git branch [本地分支名字]

​ 3,切换分支

​ 本地切换分支,命令:git checkout [本地分支名字]

​ 4,推送至远程仓库分支

​ 将在本地创建的分支推送到远程仓库中,命令:git push origin zhengjikun

​ 5,合并分支

​ 随着各个分支不断的开发,每个分支可能都不同了,合并分支的命令:git merge [分支名称] 比如我们想将zhengjik 分支合并到master 中,需要在master 分支下执行该命令

​ 有时候合并操作不会如此顺利,如果你在两个不同的分支下,对同一个文件的同一部分进行不同的修改,git 就没有办法合并他们,同时会提示文件冲突,此时需要我们打开冲突文件并修复冲突内容,最后执行git add 命令来标识冲突已经解决。

​ 当修复完冲突的文件后,需要我们执行git add [文件名],这就表明文件已经被修复,下面执行git commit 命令即可。

6,将新添加的文件推送

​ 命令:git push [remote-name] [branch-name]

7,删除分支

​ 删除的是本地分支,命令;git branch -d [本地分支名称]

​ 如果要删除的本地分支和对应的远程分支不一样,添加了一些开发动作,在执行上面命令时,并不会删除分支,如果坚持要删除此分支,可以将命令中的-d参数改为-D

8,删除远程分支

​ 命令:git push origin -d [远程仓库分支名称]

9,git 标签

​ 像其他版本控制系统(vcs)一样,git可以给历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布结点(v1.0,v1.2 等)标签指的是某个分支某个指定时间点的状态,通过标签,可以很方便的切换到标记时的状态。

​ 列出已有的标签

​ 命令:git tag ,

​ 查看 tag 信息命令:git show [tagName]

​ 创建新标签

​ 新建一个tag ,命令:git tag [tagName]

​ 将标签推送到远程仓库

​ 提交指定tag 命令:git push [remote] [tagName ]

​ 检出标签

​ 检出标签意思就是新建一个分支,将远程仓库的标签拉下来

​ 新建一个分支,指向某个tag 命令:git checkout -b [branchName] [tagName]

​ branchName 可以是新建的分支名称。

​ 删除标签

​ 删除本地tag 命令:git tag -d [tagName]

​ 删除远程tag 命令:git push origin:refs/tags/[tagName]

10,使用TortoiseGit 管理文件版本,TortoiseGit 就是git 的图形化页面

​ 1,创建仓库

​ 2,克隆仓库

​ 3,将文件添加到暂存区

​ 4,提交文件

​ 5,推送本地仓库至远程仓库

​ 6,拉取代码

​ 7,创建分支

​ 8,切换分支

​ 9,合并分支

  • Git Rebase

    • 用法:git rebase -i [startpoint] [endpoint],其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
      在查看到了log日志后,我们运行以下命令:git rebase -i 0bb85c 582db9
        或者
        git rebase -i HEAD~3

      img

上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:

pick:保留该commit(缩写:p)
  reword:保留该commit,但我需要修改该commit的注释(缩写:r)
  edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
  squash:将该commit和前一个commit合并(缩写:s)
  fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
  exec:执行shell命令(缩写:x)
  drop:我要丢弃该commit(缩写:d)

git rebase -i HEAD~3

分离 HEAD

  • 分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:git checkout 【具体提交记录】,具体提交记录指:提交记录上的标签(哈希值)

gitk命令

  • gitk是git的图形化界面软件版本 ,直接在git 命令窗口输入gitk

相对引用(^)

通过指定的提交记录哈希值的方式在Git中移动不太方便,所以Git就引入了相对引用,

使用 ^ 向上移动 1 个提交记录, git checkout master^,我们可以使用HEAD ,一直执行的话,就HEAD就一直向上。master^^ 相当于向上两个结点。

例如:git checkout master^, git checkout master^^^

“~”操作符

  • 如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~
  • 该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次),指定向上移动多少次。咱们还是通过实际操作看一下吧
  • 例如:git checkout HEAD~4

强制修改分支位置

  • 强制修改分支位置是实践相对引用,使用相对引用最多的就是移动分支。可以直接使用**-f**选项让分支指向另一个提交。
  • 例如:git branch -f 【分支名称】HEAD~3,这个命令会将main分支强制指向HEAD的第三级父提交。(改变HEAD 所在地点,来改变分支对应提交)

git reset

  • 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
  • 命令:git reset HEAD~1
  • 这个是在本地代码库回退版本。但是这种命令对远程分支是无效的。为了撤销更改并分享给别人,可以使用 git revert

回撤前

在这里插入图片描述

  • 回撤后(git reset HEAD~1)
    在这里插入图片描述

git revert

  • 命令:git revert HEAD
  • 回撤前
    在这里插入图片描述

命令:git revert HEAD

在这里插入图片描述

c2’ 的状态和c1 的状态是相同的,revert 是更改了本地的版本,然后可以将撤销的版本,推送到远程仓库

  • revert 之后,就可以把你的更改推送到远程仓库与别人分享了。

git cherry-pick

  • 命令:git cherry-pick 【哈希码】
  • 在 当前分支下执行 git cherry-pick [哈希码] ,哈希码对应的代码会提交到本分支下。

交互式的rebase

  • 命令:交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
  • 如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改

当 rebase UI界面打开时, 你能做3件事:

  • 调整提交记录的顺序
  • 删除你不想要的提交
  • 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。
出现的问题:git 命令行右侧显示(REBASE 1/3)
  • 这是因为执行了rebase 导致的,rebase --continue继续进行rebase过程,zhengjikun|REBASE 1/3 则表示zhengjik(分支) 还有两个提交等待处理,rebase --abort则会退出rebase 过程,rebase --skip则会跳过你指定分支的提交。

本地栈式提交

  • git rebase -i 命令可以重新排序
  • git commit --amend :

在这里插入图片描述

git rebase caption main 这是什么命令

这是答案。

  • 这是因为执行了rebase 导致的,rebase --continue继续进行rebase过程,zhengjikun|REBASE 1/3 则表示zhengjik(分支) 还有两个提交等待处理,rebase --abort则会退出rebase 过程,rebase --skip则会跳过你指定分支的提交。

本地栈式提交

  • git rebase -i 命令可以重新排序
  • git commit --amend :

[外链图片转存中…(img-6FCjmhTE-1618886809298)]

git rebase caption main 这是什么命令

这是答案。
在这里插入图片描述

提交的技巧 #1
  • 场景
    接下来这种情况也是很常见的:你之前在 newImage 分支上进行了一次提交,然后又基于它创建了 caption 分支,然后又提交了一次。
    此时你想对某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage 中图片的分辨率,尽管那个提交记录并不是最新的了。
  • 分析
    我们可以通过下面的方法来克服困难:
    先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前
    然后用 git commit --amend 来进行一些小修改
    接着再用 git rebase -i 来将他们调回原来的顺序
    最后我们把 main 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!
    当然完成这个任务的方法不止上面提到的一种(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。 最后有必要说明一下目标状态中的那几个’ —— 我们把这个提交移动了两次,每移动一次会产生一个 ‘;而 C2 上多出来的那个是我们在使用了 amend 参数提交时产生的,所以最终结果就是这样了。
    也就是说,我在对比结果的时候只会对比提交树的结构,对于 ’ 的数量上的不同,并不纳入对比范围内。只要你的 main 分支结构与目标结构相同,我就算你通过。
    $ git rebase -i HEAD^^ 调整c2c3,得到c3’ c2’
    $ git commit --amend (修改c2’,得到c2’’)
    $ git rebase -i HEAD^^ 调整c2’’ c3’,得到c2’’’ c3’’
    $ git checkout master
    $ git merge caption caption指向c3’’,合并到master

git tag

  • 语法:git tag 【标签名称】【提交名称】,如果不写分支名称,就是默认当前HEAD 的提交
    Git 的 tag 就是干这个用的啊,它们可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了。

更难得的是,它们并不会随着新的提交而移动。你也不能检出到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。

Git Describe

由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的锚点(也就是标签),它就是 git describe

Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。

git describe 的​​语法是:
git describe <ref>

<ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。

它输出的结果是这样的:

<tag>_<numCommits>_g<hash>
tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。

当 ref 提交记录上有某个标签时,则只输出标签名称

报错:fatal:NO names found,cannot describe anything.
因为本地仓库没有可用的tag

  • HEAD^ , HEAD~ 的区别
    HEAD是指当前的快照,这个命令主要配合reset的–hard,–mixed和–solf三个参数对对本次的修改进行处理
    HEAD1指回退一个快照,可以简写为HEAD
    HEAD~2指回退两个快照,
    HEAD^主要是控制merge之后回退的方向
    HEAD~才是回退的步数

  • git reset --hard HEAD~
    本地 git 分为 本地版本库,暂存区,工作区
    git reset HEAD 是将咱暂存区和HEAD的提交保持一致
    (将暂存区和本地仓库的提交保持一致,执行这一命令后,git 会报Unstaged changes after reset 这个问题,可以忽略,然后现在暂存区里的数据就和本地仓库里的提交数据一致了,然后我们就可以从暂存区里把 代码拉到本地工作区,使用git checkout -- 文件名命令)

  • git checkout -- 文件名

    命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

git reset --hard HEAD 是将工作区、暂存取和HEAD保持一致
(将工作区,暂存区,向本地仓库看齐,向本地仓库保持一致)
  • git checkout -b 【新建本地分支名称】【远程目标分支名称】
    另一种设置远程追踪分支的方法就是使用:git branch -u 命令,执行:

    git branch -u o/main foo

    这样 foo 就会跟踪 o/main 了。如果当前就在 foo 分支上, 还可以省略 foo:

    git branch -u o/main

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vegetari

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值