实用git指令
阅读原文时间:2022年05月13日阅读:1

本文以软件构造实验一中涉及到的git操作为基础,结合git官方文档总结了一些常用的git指令,以供需要时快速查看。实际工作中我们更多是想要解决眼前问题,比如"我想要克隆一个仓库到本地该怎么做"、"我要将我的代码上传到远程仓库怎么做"、"我要修改远程仓库代码怎么做"这样的问题,而查看一本详细的git指令教程虽然全面详细但是对于解决这些常见问题来说效率实在太低,而且对于一个连指令如何书写的小白来说一次性讲清背后原理实属无用功,所以本文主要是想以应用频率很高的git操作为切入点展开介绍,同时也为已经了解具体操作内涵只是忘记指令的人提供了简要版操作说明,更高效解决问题。


clone

操作目的:

将远程仓库复制克隆到本地指定位置

简要操作说明:

  • 打开cmd或git bash,使用cd命令进入想要将仓库clone到的本地文件夹路径
  • 使用指令git clone <仓库的url>将仓库clone到目标文件夹,使用git clone <仓库的url> 新名字 将仓库clone到目标文件夹并重命名为指定名称。

详细操作说明:

  • 打开cmd或Git Bash,使用cd命令进入想要将仓库clone到的本地文件夹路径:

    • cmd: cmd一进入默认在C盘中,如果目的文件夹不在C盘中则需要先进行切换磁盘操作,以切换到D盘为例,直接在cmd中输入 D: 即可完成磁盘转换(见下图)

    • cmd: 然后使用cd指令进入目的文件夹位置即可(此处以目的文件夹在D->JavaProject->Lab为例)cd JavaProject\Lab注意在cmd中的路径要使用'\'而非'/'(见下图),这样克隆下来的仓库就会自动存储在D/JavaProject/Lab中了

    • cmd: (当然,如果你手滑cd后面的路径输入错了但已经进入了错误的位置,也无需关闭cmd重新来过,你可以使用指令cd.. 来退出返回至上一层)

    • gitbush: 如果使用gitbush,则在gitbush下直接使用cd指令进入所在文件夹,同样以D->JavaProject->Lab为例,与cmd下路径输入要求不同,使用'/'而非'\',其次就是上来就要有/d表明进入D盘,指令:cd /d/JavaProject/Lab

  • 找到准备clone的仓库的http链接或ssh链接(如果使用ssh链接需要保证已经提前配置好ssh),查找url方法如下图(以github上的一个仓库为例进入仓库首页,点击右方绿色的Code按钮即可查看http或ssh链接,点击链接右方的按钮可自动复制)

  • 复制结束之后,返回cmd或Git Bash,输入指令git clone <仓库的url>将仓库clone到目标文件夹,clone成功后就可以在D/JavaProject/Lab下找到名字为仓库名称的文件夹了,这个文件夹中就是仓库中所有的内容了。(下图以cmd操作为例)

    • 如果你不想将文件夹的名字是默认的仓库名,第一种办法当然是右键重命名,第二种方法就是使用指令git clone <仓库的url> 新名字 将仓库clone到目标文件夹并重命名为指定名称,这里我将原名为test的仓库clone下来的文件夹命名为MyTest,这样clone下来的仓库文件夹名字自动设置为MyTest了。

      (如果使用上述操作报错了多半是网络原因连不上github,可以多试几次或查找报错解决方案)


init & add & commit & push

操作目的:

将本地仓库上传到远程仓库

简要操作说明:

  • 打开cmd或Git Bash使用cd指令进入本地仓库(也就是存储所有项目文件的那个本地文件夹)所在位置
  • git init
  • git add .提交所有文件;或使用指令git add <file>提交单个文件
  • git commit -m "<description>"
  • git remote add <name> <http/ssh链接>与远程仓库建立链接,处换成此链接名字即可,一般都命名为origin
  • git push <name> master : master合并分支

详细操作说明:

  • 打开cmd或Git Bash使用cd指令进入本地仓库(也就是存储所有项目文件的那个本地文件夹)所在位置

    • cmd: cmd一进入默认在C盘中,如果目的文件夹不在C盘中则需要先进行切换磁盘操作,以切换到D盘为例,直接在cmd中输入 D: 即可完成磁盘转换(见下图)

    • cmd: 然后使用cd指令进入目的文件夹位置即可(此处以目的文件夹在D->JavaProject->Lab为例)cd JavaProject\Lab注意在cmd中的路径要使用'\'而非'/'(见下图),这样克隆下来的仓库就会自动存储在D/JavaProject/Lab中了

    • cmd: (当然,如果你手滑cd后面的路径输入错了但已经进入了错误的位置,也无需关闭cmd重新来过,你可以使用指令cd.. 来退出返回至上一层)

    • gitbush: 如果使用gitbush,则在gitbush下直接使用cd指令进入所在文件夹,同样以D->JavaProject->Lab为例,与cmd下路径输入要求不同,使用'/'而非'\',其次就是上来就要有/d表明进入D盘,指令:cd /d/JavaProject/Lab

  • 输入指令git init将原文件夹初始化为git仓库,以本地仓库TEST为例,其所在位置为D:/JavaProject/TEST这里的init操作需要我们进入这个仓库再进行,比如这个TEST仓库中有两个文件(以下在Git Bash下演示,也可以使用cmd)

  • 使用git add类指令指定所需文件进行追踪,一般使用git add .):

    • git add -A :等价于git add -all提交所有变化

    • git add -u :等价于git add -update提交被修改(modified)和被删除(deleted)的文件,不包括新文件(new)

    • git add . :提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)的文件,并根据.gitignore文件做过滤

    • git add * :不会根据.gitignore文件做过滤而是将任何文件都加入

    • git add <file> :提交单个指定文件<file>处换成指定文件名称即可

  • (此步可忽略)(可以使用指令git status查看当前文件夹中所有文件状态,如果是红色表示还没被add到暂存区,绿色表示已经add到暂存区)

    如果此时删除一个文件"MagicSquare.java"再运行指令git status则出现

    这里仔细阅读可以发现如果是误删了这个文件,那么我们可以使用指令git restore <file>进行恢复

  • 输入指令git commit -m "<description>" 将修改从暂存区提交到本地库:<description>处换位对此次提交的叙述即可,比如可以是"initial commit","second","for fifth commit","add a test"等等,总之就是为了之后查看此次提交时能根据描述想起此次操作信息即可。

  • 连接远程仓库:使用git remote指令检查现在已创建好的远程链接,如果是第一次创建则使用该指令将没有返回值,使用指令git remote add <name> <http/ssh链接>,处换成此链接名字即可,没有要求,自己命名,一般都命名为origin,就换成你想要提交的仓库的http/ssh链接即可,当然如果你想使用ssh链接就需要提前配置好相关设置,但好处是之后无需反复输入用户名和密码,更方便。查看相关链接方法如下图。再使用指令git remote检查一下是否已经创建好链接,如果创建好则该指令返回origin(或是你刚才的命名)

  • 使用指令git push类将本地库分支推送到远程仓库分支:(按使用频率排序,选择所需指令即可)(如果之前链接使用的是http链接此时提交就需要你输入用户名和密码,如果是ssh链接此时就无需输入)

    • 如果所要提交到的远程仓库分支中的内容包含于本地仓库分支中的内容,那么你直接使用指令git push <name> <本地分支名>:<远程分支名>就是之前你自己起的远程连接名,一般是origin。具体指令例如可以是git push origin master:master该指令可将当前本地仓库的master分支推送到远程仓库master分支中,如果远程仓库没有master分支则会自动创建,你的提交到此为止。(这里我又新创建了一个ssh链接对应的origin1,使用origin1进行上传)点开github就可以在master分支中找到文件了

    • 如果所要提交到的远程仓库分支中的内容不包含于本地仓库分支中的内容使用git push <name> master:master指令就会报错,并提示你先pull下来再push,此时你有以下几种选择:

      • git push -f origin master:master:不想pull下来,甚至不想要远程分支内的所有内容,只想要把本地的push上去,那么使用强制提交指令git push -f origin master:master将本地master分支强制提交成为远程仓库的master分支
      • git pull origin master:master:先提交本地修改git add . ,git commit -m "init",再pull下来git pull origin master:master,如果出现"Please enter a commit message to explain why this merge is necessary"可按esc键同时输入:wq退出或按i键进入insert模式修改最上面黄色选中的信息,选择不修改。
    • 几种省略写法:

      • git push origin master:指令git push origin <本地分支名>:<远程分支名>中远程分支名被省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在则将会被新创建
      • git push origin :master:指令git push origin <本地分支名>:<远程分支名>中本地分支名被省略,则相当于push一个空的本地分支到远程分支,表示删除该远程分支master,等同于指令git push origin --delete master
      • git push origin:如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,会将当前分支推送到对应分支上,当然如果你这么写系统会提示你把指令写全,如果你每次都是提交到master分支上,可以输入指令git push --set-upstream origin master只需输一次这个指令,以后就都可以省略写成git push origin而不会再提示你补全指令了

pull & fetch & merge

操作目的:

拉取远程仓库代码至本地,将远程仓库代码与本地仓库代码合并

简要操作说明(拉取有权限的仓库):

  • 打开cmd或Git Bash使用cd指令进入pull操作后想要存放的目标文件夹所在位置

  • git init:git pull要求必须连接远程仓库

  • git remote add <远程主机名name> <http/ssh链接>:git pull要求必须连接远程仓库,处换成此链接名字即可,一般都命名为origin

  • git pull <远程主机名name> <远程分支名>:<本地分支名>处换成此链接名字即可,一般都命名为origin,pull操作会自动fetch和merge,git pull = git fetch + git merge,如果本地仓库已经修改与远程仓库不同但是不想更新本地仓库与远程保持一致,则需先git add . ,git commit -m "init",再pull下来git pull origin master:master如果出现"Please enter a commit message to explain why this merge is necessary"可按esc键同时输入:wq退出或按i键进入insert模式修改最上面黄色选中的信息,选择不修改。

简要操作说明(拉取无权限的仓库):

(无权限仓库拉取说白了就是clone)

  • 打开cmd或git bash,使用cd命令进入想要将仓库拉取到的本地文件夹路径
  • 使用指令git clone <仓库的url>将仓库clone到目标文件夹,使用git clone <仓库的url> 新名字 将仓库clone到目标文件夹并重命名为指定名称。