git常用命令

更加详细的信息可参考:git官方说明文档
一个大佬讲git的博客:通俗易懂git朱双印博客

概念梳理

主要梳理什么是git对象、分支、HEAD、工作区、暂存区、仓库等。

git对象

包括blob、tree和commit。blob为文件,对于我们程序来说就是一个个.c、.h、.proj等。tree为目录,它保存某一时刻根目录中的直接文件信息和直接目标信息。tree指向直接目录下的文件对象也就是blob和下一级目录的tree,tree有多层,取决于你的目录层级。commit也就是提交指向tree。每个git对象都有一个哈希码,常用的就是提交的哈希码。

工作区、仓库、暂存区

在这里插入图片描述
仓库:仓库是一个目录,只有这个目录中的文件才能被git管理,我们可以叫它“仓库”、“版本库”、“repo”、“repository”。

创建一个仓库:

git init
git init test

比如在myrelease(命令上方会显示当前所在路径和当前所处分支名称)下git init,那么.git的路径就是myrelease/.git

除了.git之外的其他文件和目录组成了工作区,我们实际的创建文件和目录、编辑文件、删除文件和目录这些工作都发生在这个区域。
当工作区的状态保存到版本库以后,工作区的文件就换转换成blob对象,相应的目录结构转换为tree。blob和tree在.git中的对象库中。

git add .
git add -A
git commit -m"second edition"

“git add”:将需要进行提交的变更加入到暂存区。

“git commit”:将所有加入暂存区的变更作为一个变更集合,创建提交。

通过上面两个命令把工作区的状态保存到版本库中。git add可以选择将哪些变更添加到下一次提交中。git add创建blob而git commit创建tree对象和commit对象。其实工作区和版本库中还有一个看不见的区域叫做暂存区,它存在的目的是可以选择哪些文件的更改不进行提交。

git status查看有没有变更的状态,并且查看哪些变更已经加入了暂存区,红色的变更表示只存在于工作区,还未加入暂存区,绿色的变更表示已经加入到暂存区,这些变更将会被提交。

远程分支和本地分支联系

以remotes/origin开头的分支代表了origin远程仓库中的分支,这些分支实际存放在本地仓库中,但是这些分支代表了远程仓库中的分支,可以把这些分支理解成远程分支在本地的大使,本地通过大使与远程分支进行实际的交互。
通过下面一系列操作来理解远程分支和本地分支:

  1. 克隆代码
git clone https://github.com/master-dev.git  
  1. 查看所有分支
git branch --all  
# 默认只有master分支,所以会看到如下两个分支:
# master[本地主分支] origin/master[远程主分支]
# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步
  1. 创建本地新的dev分支
git branch dev  # 创建本地分支
git branch  # 查看分支
# 这时会看到master和dev,而且master上会有一个星号
# 这个时候dev是一个本地分支,远程仓库不知道它的存在
# 本地分支可以不同步到远程仓库,我们可以在dev开发,然后merge到master,使用master同步代码,当然也可以同步
  1. 发布dev分支
# 发布dev分支指的是同步dev分支的代码到远程服务器
git push origin dev:dev  # 这样远程仓库也有一个dev分支了
  1. 在dev分支开发代码
git checkout dev  # 切换到dev分支进行开发
# 开发代码之后,我们有两个选择
# 第一个:如果功能开发完成了,可以合并主分支
git checkout master  # 切换到主分支
git merge dev  # 把dev分支的更改和master合并
git push  # 提交主分支代码远程
git checkout dev  # 切换到dev远程分支
git push  # 提交dev分支到远程
# 第二个:如果功能没有完成,可以直接推送
git push  # 提交到dev远程分支
# 注意:在分支切换之前最好先commit全部的改变,除非你真的知道自己在做什么
  1. 删除分支
git push origin :dev  # 删除远程dev分支,危险命令哦
# 下面两条是删除本地分支
git checkout master  # 切换到master分支
git branch -d dev  # 删除本地dev分

clone/fetch/pull区别

git clone:克隆的是整个远程库。
git fetch:克隆的是远程库的一个分支。

git clone顾名思义就是将其他仓库克隆到本地,包括被clone仓库的版本变化。.git文件夹里存放着与远程仓库一模一样的版本库记录。

理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某个branch在服务器上的最新状态’。这个列表保存在.Git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支。
当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支.
一般来说, 存在两种情况:

如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD
如果指定了远程分支,就将这个远程分支作为FETCH_HEAD

git pull是拉取远程分支更新到本地仓库的操作。比如远程仓库里的学习资料有了新内容,需要把新内容下载下来的时候,就可以使用git pull命令。事实上,git pull是相当于从远程仓库获取最新版本,然后再与本地分支merge(合并)。

git pull = git fetch + git merge

注:git fetch不会进行合并,执行后需要手动执行git merge合并,而git pull拉取远程分之后直接与本地分支进行合并。更准确地说,git pull是使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。

常用操作

远程仓库

# 连接远程仓库
git remote add origin http://192.168.44.2/myrelease/rtklib.git
# 查看远程仓库地址
git remote -v

下载/更新

git clone git@192.198.44.2:myrelease/rtklib.git

通过克隆操作,获取到了远程仓库中的最新的代码,下载后默认当前分支为master分支,指向远程仓库master分支。

下载指定分支:

git clone -b YYY git@192.168.44.2:myrelease/rtklib.git

下载远程分支YYY到本地
注意:
克隆某分支到本地目录,然后在该目录下push时,对应的就是push到远端的对应分支

有时远程仓库的大多数代码已经存在于本地上了,只不过这些本地的代码并不是最新的代码,用户需要做的就是获取最新代码到本地,以便查看或者操作,此时就需要用到下面命令:

git fetch origin

或者

git fetch

如果有其他用户更新了其他分支并推送到了远程仓库中,那么我们执行”git fetch”命令后,就能看到所有更新的分支的信息。
也可以只更新某个分支:

git fetch origin branch1
git fetch origin branch1:branch2

使用远程branch1分支更新本地branch2(但不会切换到该分支)。如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,如果本地存在branch2分支, 并且是`fast forward’, 则自动合并两个分支, 否则, 会阻止操作。

通过git fetch我们可以把远程仓库的最新代码同步到本地中,就是将真正存在于远程服务器中的分支中的新内容同步到本地的”代表”分支中,以便用户再通过”代表”分支进行进一步的操作。只有从远程同步到本地过的分支才可以通过check out显性地出现在本地分支中。

但是”git fetch”命令只会将真正的远程分支中的更新同步到本地的”代表”分支中,并不会将更新一并同步到真正的”纯”本地分支中。(is behind ‘origin/XXX’ by 1 commit,落后远程分支一个提交)把代表分支中的更新同步到本地工作区中的分支中,需要执行合并操作:

git merge origin/需要同步的分支

此命令指合并到当前分支。

其实,fetch+merge的操作步骤可以通过一条命令完成,这条命令就是”git pull”命令,也就是说,”git pull”命令会完成”git fetch”命令和”git merge”命令两条命令的工作。用于从远程获取代码并合并本地的版本。

git checkout testmodule
git pull origin testmodule

当想要pull某个分支时,一定要先切换到对应的分支,因为”git pull”命令的默认动作就是pull指定的远程分支到当前分支

git pull origin Abr:Abr

上述命令的意思是,将远程的Abr分支pull到本地的Abr分支,同时,将远程的Abr分支pull到本地的当前所在分支。如果我们当前就处于Abr分支,那么上述命令的作用就是将远程Abr分支的最新更新拉取到本地Abr分支,如果我们当前处于非Abr分支,那么上述命令就会将远程Abr分支更新到本地Abr分支的同时,也将远程Abr分支pull到本地当前分支。

将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并,则需要使用以下命令:

git pull origin master:brantest

如果远程分支是与当前分支合并(当前分支已经master),则冒号后面的部分可以省略。

git pull

执行该命令时默认是拉取当前分支的同名分支到当前分支,并且将其他分支的同名上游分支的更新fetch到本地。当本地分支与上游分支同名时,”git pull”命令会对当前分支执行(fetch+merge)操作,对其他分支执行fetch操作。

rebase参数:使得自己的修改在其他提交之上:

git pull --rebase origin branch1

将远程的branch1拉到当前分支。

将远程origin仓库的xx分支合并到本地的yy分支,
操作一:

git fetch origin xx
git checkout yy
git merge FETCH_HEAD

操作二:

git checkout yy
git pull origin xx

操作三:

git checkout xx
git pull   // 如果本地没有xx分支的,这一步都可以不执行。
git checkout yy   // 切换到yy分支
git merge xx  //  将xx分支合并到yy分支  这一步可以加上 --no-ff 参数,即 git merge --no-ff

分支操作

通常用户需要基于master分支开发新的模块,为了不影响现有的稳定代码,我们通常会创建一个新的分支来完成新的开发工作,也就是需要基于master分支创建新的分支,当然,如果需要基于其他分支(比如M分支)开发新模块,也可以先检出到M分支,然后基于M分支创建新分支。

git branch -a
git branch -r
git branch -v/-vv

参数-r查看远程分支,-a(all的缩写)查看远程和本地所有分支,加*的是本地目前所处分支。没有参数时,git branch 会列出你在本地的分支。参数v或vv可以查看更多当前分支信息, -v 可以列出分支的最后一次提交,-vv列出本地分支关联的远程分支。

创建分支:

当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。

git branch XXX

创建一个名叫XXX的分支

切换分支:

git checkout -b XXX

创建一个名叫XXX的分支并切换到它上面,如果没有-b就只能先branch创建分支,再checkout切换到上面去

从远程拉一个分支到本地:
因为默认从远程下载(clone)的是主分支,所以想要使用远程其他分支还需要进行checkout

git checkout -b XXX origin/YYY

但是执行此命令后会进入detached state
为什么git checkout origin/XXX远程分支的时候会让HEAD进入detached state?
因为HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",而本地又没有这个分支,HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。
关于HEAD的详细解释在前面的参考链接中有。

也可以拉远程分支YYY到本地当前分支:

git checkout origin/YYY

删除删除XXX分支:

git branch -d XXX

提交操作

先明确git中工作区和暂存区的概念(来自廖雪峰老师git讲解)
在这里插入图片描述
工作区即时电脑本地目录所在,工作区有一个隐藏目录.git是Git的版本库。版本库中有暂存区(stage),还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把把文件修改添加到暂存区;
第二步是用git commit提交更改也就是把暂存区的所有内容提交到当前分支。
因为创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

具体命令为:

git status
git add test.c
git commit -m"修改了部分bug"

引号中为该次提交的备注

回退操作:

git log
git log --oneline

oneline为简洁显示一行

git reset --mixed HEAD/git reset HEAD^/git reset HEAD~2/git reset
git reset --soft HEAD
git reset --hard HEAD

HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2

--mixed

意思是:不删除工作区改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

--soft
不删除工作区改动代码,撤销commit,不撤销git add .

--hard
删除工作区代码,撤销commit,撤销git add .,完成这个操作后,就恢复到了上一次的commit状态。

上述命令其实不仅仅适用于最新的提交,我们还可以把上述命令中的”HEAD”替换成任意一个提交的哈希码(commit ID):
查看commitID使用以下命令:

git log --oneline
git reset --mixed commitID/git reset commitID
git reset --soft commitID
git reset --hard commitID

还可以只回退某个文件:

git reset HEAD -- fileA fileB
git reset commitID -- fileA fileB

上述主要描述了如何将暂存区的变更撤销,以及如何将工作区和暂存区的变更全部撤销,假设只想撤销工作区的变更(若还没有add则将将工作区回到最近一次提交的状态,如果已经add则将工作区恢复到最近一次暂存的状态),可以采用如下命令:

git checkout -- file
git checkout -- ./*

这里指的工作区的所有变更是指已经被git跟踪的文件的变更,如果是新创建的文件,还没有被加入到版本库,则不能使用”git checkout – ./*”命令撤销。

通过”git checkout – file”命令可以帮助我们撤销工作区中的变更,但是这种撤销是分情况的,如果撤销的文件已经添加到了暂存区中,并且在那之后又在工作区中进行了新修改,那么”git checkout – file”命令会将工作区中的最新的变更撤销,将文件的状态还原成上次暂存时的状态(已经暂存的无法通过这种方法撤销),如果暂存区中并没有对应的文件的变更,那么”git checkout – file”命令会将工作区中的变更撤销,将文件的状态还原成上次提交时的状态。

git push 命令用于从将本地的分支版本上传到远程并合并。

git push origin master:m1

表示将本地的master分支推送到远程origin仓库的m1分支中,如果远程仓库中并没有名为m1的分支,那么远程仓库中会自行创建一个m1分支。

 git push origin master:master
 git push origin master
 git push

上述两个命令是等价的。
通常情况下,为了方便记忆,都会将远程同名分支设置为上游分支。当两个分支同名时可以省略冒号及其后面的内容。如果没有上游分支是无法直接使用git push命令的。
上游分支设置方法:

git push --set-upstream origin new:new
git push -u origin new:new

此命令在推送本地new分支到远程仓库的同时,直接将本地new分支的上游分支设置为远程仓库中的new分支。

也可以分两步完成,先推到远程:

git push origin new

再手动设置上游分支:

git branch new -u origin/new

删除远程分支:

git push origin -d XXX

我们有时会遇到这样的情况,正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可以使用git stash命令先把当前进度(工作区和暂存区)保存起来,然后切换到另一个分支去修改bug,修改完提交后,再切回dev分支,使用git stash pop来恢复之前的进度继续开发新功能。

git stash
git stash pop
git stash apply stash@{$num}
git stash drop stash@{$num} #移除
git stash list #查看当前stash的所有内容
git stash show #查看堆栈中最新保存的stash和当前⽬录的差异,显⽰做了哪些改动,默认show第一个存储
git stash clear #移除全部stash
git stash -- file.txt #暂存特定文件

日志

git log可以看到历史提交记录
按下键或J查看下一条
git log origin/XXX查看远程某分支上的提交记录

其他命令

git init 初始化仓库
git clone 拷贝一份远程仓库,也就是下载一个项目。
git add 添加文件到暂存区
git status 查看仓库当前的状态,显示有变更的文件。
git diff 比较文件的不同,即暂存区和工作区的差异。
git commit 提交暂存区到本地仓库。
git reset 回退版本。
git rm 将文件从暂存区和工作区中删除。
git mv 移动或重命名工作区文件。
git log 查看历史提交记录
git blame 以列表形式查看指定文件的历史修改记录
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并

遇到的报错解释

1 ahead/behind
解释:本地commit了代码,没有push,就是超前。remote上有更新,本地没有pull,就是落后。
例如项目里有A,B,C三个文件共同开发,A文件修改就是超前,当B文件被人修改后再提交到远程分支,这样就是本地的B文件落后咯,C文件本地和远程都没改过,所以没变动

2 游离头:detached head
detached HEAD state指的是什么
正常情况下,HEAD指向一个branch,而branch又指向一个commit。
detached HEAD state指的是HEAD指针没有指向任何的branch,而是指向了一个commit。

detached HEAD state时能做什么
可以提交,这个时候,commit链就在git checkout这个commit的基础上展开,但是如果直接离开到一个branch上的话,这些commits就会被当成garbage,被git garbage collection routine所回收。但是,我们也可以保留这些commits,又下面三种方式:

$ git checkout -b foo ,创建一个branch指向这个commit链,然后HEAD指向这个branch,于是HEAD就不是处于detached state。
$ git branch foo,创建一个branch指向这个commit链,但是HEAD还是处于detached state。
$ git tag foo,创建一个tag指向这个commit链,HEAD还是处于detached state。

为什么git checkout origin/XXX远程分支的时候会让HEAD进入detached state
因为HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",而本地又没有这个分支,HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。

这个时候可以
git checkout -b 分支名
HEAD就恢复正常,并且local brach 就会跟踪远程分支origin/分支名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python Git常用命令大全: Git是现代化的版本控制系统,常被用于软件开发,协作和管理。它允许在开发过程中创建和管理不同的版本,跟踪文件的更改,以及支持团队合作。Python则是一种广泛应用于开发Web应用程序以及数据科学和人工智能领域的高级编程语言。在使用Git时,Python的代码可以与Git进行集成。这里是Python Git常用命令的大全: 1. git init:初始化一个新的 Git 仓库。 2. git clone:从现有的 Git 仓库克隆项目,可以是本地仓库或远端仓库。 3. git add:将文件添加到 Git 仓库中。git add . 可以添加所有更改。 4. git commit:将所有已添加的文件提交到本地 Git 仓库中。 5. git status:查看当前工作目录中 Git 仓库的状态。 6. git log:查看提交记录。 7. git push:将本地 Git 仓库的更改推送到远端仓库。 8. git pull:将远端 Git 仓库的更改拉到本地仓库。 9. git branch:创建新的分支。 10. git checkout:切换分支。 11. git merge:将一个分支的更改合并到另一个分支。 12. git revert:撤销一个提交。 13. git rebase:将一个分支的修改合并到当前分支。 14. git config:配置 Git。 15. git remote:管理远端仓库。 这是Python Git常用命令的大部分命令,但这并不是全部。在使用Git和Python时,这些命令应该是最为重要的。无论是在个人项目中还是团队合作中,这些命令会让你更加高效地使用Git,并保护你的代码免遭不可挽回地灾难。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值