Git常用操作及命令摘要

文章目录

使用说明

命令中的<>部分,为可替代项,使用时按自己的需求用自定义字符串替换即可;
命令中的[]部分,为可选项,使用时按自己的需求选择添加零个或多个。

Git开发背景及简介

  Git是一个分布式版本控制软件。首先是由Linux创始人:林纳斯·托瓦兹 为了更好地控制Linux开源开发创作的。早期Linux的开源后,由林纳斯本人手动整合各地攻城狮反馈来的内核代码!因为当时即使有版本控制软件,要么是收费的,要么有缺陷林纳斯看不上。然而随着Linux的发展,再牛的大咖也撑不住海量的代码合并,因此后续由BitMover公司将BitKeeper版本控制软件免费提供给Linux社区使用。但在2005年,安德鲁·垂鸠 因编写可直接连接BitKeeper代码库的程序,导致BitMover收回BitKeeper在Linux社区的免费使用权。在协调无效后,林纳斯用十天时间开发出Git第一个版本。而时至今日,Git已发展成为最优秀的分布式版本控制软件。

  Git在Windows上安装后会有cmd和bash两个启动程序,我习惯于使用bash,bash更贴近于Linux。当然还有很多Git GUI以供使用。Linux上安装Git也很简单,依然是下载,然后解压,参照INSTALL文件安装即可。GIt是C语言开发的,因此需要先编译后安装。依次输入:

$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

即安装到/usr/local/bin目录下。

绝 对 不 要 在不清楚你在干什么的情况下执行:git clean -d -fx命令

命令集

-------------仓库相关操作-------------

创建本地仓库 git init

  创建一个合适的目录后,使用Git的cd命令进入,并执行git init命令。Git即会在将本目录作为一个本地仓库初始化。

删除本地仓库

  想删除本地仓库直接进入仓库对应的目录下,会有一个名为.git的隐藏文件,删除它即可。

克隆远程库 git clone <repository_link>

  克隆远程库通常是中途加入开发的第一步,git clone <repository_link>命令会在本地工作区创建一个与远程仓库同名的目录。不过可以通过指定第二个参数来指定自己想要的本地目录名:git clone <repository_link> <dir_name>。同时,git clone命令可支持多种协议,如:http[s]/git/ssh/ftp[s]/rsync/file。第一次使用ssh协议连接GitHub时,Git会给出一个警告,输入yes即可,后续使用不再给出。ssh协议比https协议更快,并且不必每次推送都需要输入口令。

添加远程库 git remote [add <repository_name> <repository_link>]

  git remote add <repository_name> <repository_link>:添加指定克隆地址的一个远程仓库,并为其取一个 别名。添加一个全新的远程库时,您第一次推送分支需要加上-u参数,git push -u <repository_name> master命令会将本地master分支推送到远程库,同时将本地master分支和远程master分支关联起来。这样在以后的推送和拉取时可以简化命令。
  git remote命令用于管理一组远程库。不带参数时,可列出远程库中已存在的远程分支;
  git remote -v命令用于列出远程库中已存在的远程分支,并在后面列出对应克隆地址;

删除远程库 git remote rm <repository_name>

  执行git remote rm <repository_name>命令将删除指定的远程仓库。当然,不用多想,此命令权限一般会被严格控制。

----------------文件相关操作---------------

添加文件 git add [-f] <file_name>

  将需要由Git管理的文件加入暂存区后,Git才能控制其版本迭代。使用 git add <file_name>命令。但此命令默认不会添加忽略的文件,想要添加已忽略的文件,需要:-f参数。而修改较多时,可以使用:git add .命令将所有修改全部加入到暂存区。

提交文件 git commit -m [-a] "<message>"

  把暂存区中已添加的需要更新的文件提交到Git本地仓库中,使用git commit -m "<message>"命令。message指的是本次提交的说明。-m参数事实上可以不添加,但在这里我并没有将其记录为可选项,请记住只要提交必定要添加说明信息。
  参数:-a会自动将工作区中的改动加入到暂存区,同时自动提交到本地仓库中,相当于git add命令和git commit命令的结合体。

删除文件 git rm <file_name>

  git rm命令会删除某个文件并将删除操作记录下来,后续需要使用git commit命令对操作进行提交。但rm命令只会删除物理文件而不会产生操作记录。
  git rm -r <dir_name>:删除一个目录,并将它从Git中移除;
  git rm --cached <file_name>:从暂存区移除一个文件,但不删除该文件本身。

-------------查询信息--------------

查询提交日志 git log

  使用git log命令将按照由近及远的时间顺序显示提交日志,默认显示的内容包括:版本号、作者名、提交日期、命令内容。但此命令只能查询当前窗口中的提交,因此关闭窗口后再打开,将丢失之前所做的提交。要想查询所有版本号,还可以使用git reflog
  git log <分支名> <子目录>:显示该分支下指定目录(可多个,空格隔开)的所有提交;
  git log --since="<time>" -- <file_name>:显示自指定时间点后,指定文件的提交记录;
  git log --until="<time>" -- <file_name>:显示自指定时间点前,指定文件的提交记录;
  --since--until参数可以一起使用,以精确控制日期)
  git log --graph --pretty=oneline --abbrev-commit:图形化显示提交历史;
  git log --author=<author>:显示指定作者的提交记录;
  常用参数还有:--pretty=oneline:此参数会控制输出内容为一行,仅输出版本号和命令内容。

查询操作日志 git reflog

  使用git reflog命令将显示每次操作,内容为:文件版本号、HEAD指针指向、操作类型、操作说明。

查询工作区和暂存区状态 git status

  使用git status命令将显示工作区和暂存区的文件状态,修改是否入暂存区、文件是否被Git跟踪等信息。但不会显示已提交到仓库中的信息。

------------修改操作-------------

版本回退 git reset [--hard] [HEAD^|HEAD^^|commit_id前七位]

  使用git reset --hard <版本>命令回退到你想要的版本,参数如下:
  HEAD^:回退到上一个版本;
  HEAD^^:回退到上上一个版本;
  commit_id前七位:回退到指定版本。
  --hard参数:重置暂存区和工作区,自上次提交以来工作区中的改变都会被丢弃。

管理修改 git diff <file_name>

  使用git diff命令比较的是工作区中当前文件和暂存区之间的差异,也就是修改之后还没有暂存起来的变化内容。但git diff命令的作用不止于此,通过参数可以实现更多可行操作。
  git diff <commit_id1> <commit_id2>:比较两次提交之间的差异;
  git diff <branch1> <branch2>:在两个分支之间比较;
  git diff --staged:比较暂存区和本地仓库中的差异。

撤销修改 git checkout -- <file_name>

  使用git checkout -- <file_name>命令将工作区中指定文件恢复到最近一次git commit或git add的状态。而git checkout命令还能更新工作区中的文件以匹配指定区域中的版本,或者使用git checkout <branch>将指定的分支设置为当前分支。因为这条命令会重写工作区,因此请谨慎使用!但是从未被添加到暂存区/版本库中的文件,是无法恢复的!
  git checkout commit_id file_name:将指定文件恢复到指定版本。

变基整理提交历史 git rebase

  首先接触变基操作的第一步,不是急匆匆地去理解何为变基,而是要绝对记住一条金科玉律:不要对 在你的仓库外,还有副本的 分支 执行变基操作,即如果有别人也拉取了某个分支,那么你千万不要在远程仓库上执行变基操作。或者请记住:你只能在从未推送到远程仓库的提交上,在推送它之前使用变基操作进行清理提交记录。“否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你。”如果你真的触犯了这一条,那么请到Git官方文档获取帮助。
  使用git rebase命令会整理当前分支的提交,这会改变你的提交历史,使得图形化的提交历史改为一条直线,一般在你发现本地从未推送到远程库的分支的提交记录比较复杂脏乱时,为了便于项目负责人的后续整合,你可以先在本地执行变基操作后再推送到远程库,这样项目负责人只需进行快速合并即可。但如果强调项目的提交历史不得更改,则不能使用变基操作。

------------分支相关操作-------------

创建及查看分支 git branch [<branch_name>]

  使用git branch <branch_name>命令将创建一个指定名称的分支。或者使用git checkout -b <branch_name>命令同时会创建一个指定的分支并切换到该分支。
  git branch:查看当前分支。事实上会列出所有分支,但在当前分支上有个" * “。--list参数也能实现此功能;
  git branch -a:查看本地和远程所有分支,在当前分支上有个” * ";
  git branch -m <branch_name1> <branch_name2>:为<branch_name1>分支改名为:<branch_name2>;
  git checkout -b <branch_name1> <repository_name>/<branch_name2>:根据远程库repository_name的制定分支branch_name2创建本地分支branch_name1。这里repository_name为远程仓库别名,与“添加远程库”中的相同。

切换分支 git checkout <branch_name>

  使用git checkout <branch_name>命令将会从当前分支切换到制定分支。
  git checkout -b <branch_name>命令是git checkout -b <branch_name>命令和git checkout <branch_name>命令的集合。执行此命令将会创建并切换到指定分支。

合并分支 git merge [--no-ff -m "<message>"] <branch_name>

  使用git merge <branch_name>命令将指定分支合并到当前分支。合并分支后即可删除分支了。
  而分支合并可有两种状态,即fast forward状态和禁用fast forward状态。fast forward状态指的是快速合并,Git会直接将master指向指定分支,这样速度就非常快,但是缺点是合并后原制定分支被删除后就会丢掉分支信息。禁用fast forward状态则会使得Git在合并分支时产生一个新的commit,这样在分支历史上就保留了分支信息。
  git merge <branch_name>命令即为fast forward状态合并;git merge --no-ff -m "<message>" <branch_name>命令即为禁用fast forward状态合并。message为commit说明信息。
  可通过git log --graph --pretty=oneline --abbrev-commit命令查看图形化分支历史来观察两命令之间的区别。

删除分支 git branch -d <branch_name>

  使用git branch -d <branch_name>命令将指定的本地分支删除。
  git push <repository_name> --delete <branch_name>:删除指定远程仓库上的指定分支。
  而有时遇到甲方脑子一热,决定加一个新功能,当然任务是交给你做的。结果你加班熬夜做出来,甲方突然冷静了下来,决定还是不要了 需要删除未被合并的分支时,使用此命令Git将报错:error: The branch ‘<branch_name>’ is not fully merged.,但同时也会给出友好提示:使用git branch -D <branch_name>可强制删除未合并分支。

推送分支 git push <repository_name> <branch_name>

  使用git push <repository_name> <branch_name>命令将指定的本地分支推送到指定的远程仓库的已关联分支,这里repository_name为远程仓库别名,与“添加远程库”中的相同。之前的add、commit操作都是本地仓库中作业,只有在push后,你的精彩代码才会展现到别人面前。但不是所有分支都要push到远程库,比如bug分支,一般不用推送,除非项目负责人要求看看你修了几个bug。

拉取修改 git pull

  使用git pull命令将会从远程库拉取新版本的代码到本地。但请注意,如果本地分支有未与远程库相关联的,Git则会报错:There is no tracking information for the current branch. 但同时会给出提示,使用:git branch --set-upstream-to=<repository_name>/<branch_name2> <branch_name1>命令将远程库repository_name指定分支branch_name2与本地制定分支branch_name1关联起来即可。

-------------切换现场操作-------------

保留现场 git stash

  使用git stash命令将当前分支的工作现场保存起来,以便切换到其他分支开始新的工作,当新工作完成后,再回来恢复现场继续本分支的工作。类似于CPU的进程切换机制。
  在开发中,我们难免会接到突发任务,修某处的bug,改某处的业务逻辑,捉摸不透的甲方为我们的工作设下重重迷雾。而当你需要跳出手头的工作时,却发现手头的工作还没干完呢,绝对不能提交。提交扣钱,不去修bug也扣钱,这时你就需要git stash命令的拯救了。
  在当前分支使用此命令后,工作区中未提交的文件即被“隐藏”。此时工作区可用于开始其他任务。比如修复bug,先切换到有bug的分支,在它的基础上新建一个bug分支,在bug分支上修复完成后合并,再删除bug分支。

恢复现场 git stash [apply | pop] [stash@{0~N}]

  使用git stash [apply | pop]命令将恢复当时工作现场。
  区别是:
    使用apply参数恢复后不删除保存在“恢复区”中的文件,而需要后续通过git stash drop命令删除;
    而使用pop参数则会在恢复的同时即进行删除。
  我们可以进行多次stash操作,这样在恢复区中会有多条stash记录。它们通过:stash@{0~N}进行标记。因此我们可以指定恢复到哪个stash操作时的现场。首先通过git stash list命令查看stash记录,假设您想恢复到标记为stash@{3}的记录,则执行git stash [apply | pop] stash@{3}命令。

------------标签相关操作-------------

创建标签 git tag <tag_name> [commit_id前七位]

  使用git tag <tag_name>命令将在当前分支的最新一个commit操作上打一个指定标签。可以使用标签定向搜索commit。
  git tag <tag_name> [commit_id前七位]命令将在当前分支的指定的commit操作上打一个指定标签。可以使用标签定向搜索commit;
  git tag -a <tag_name> -m "<message>" [commit_id前七位]命令将在当前分支的指定的commit操作上打一个指定名称,且带message说明的标签;
  git tag命令会列出所有标签;
  git show <tag_name>命令会显示指定标签的详细信息。

删除标签 git tag -d <tag_name>

  使用git tag -d <tag_name>命令可以删除本地的指定标签,而删除远程库中的标签需要使用:git push <repository_name> :<branch_name>/<tag_name>命令。

推送标签 git push <repository_name> <tag_name>

  使用git push <repository_name> :<branch_name>/<tag_name>命令将本地一个指定标签推送到指定的远程仓库。而当全部标签都需要推送时,使用:git push <repository_name> --tags命令。

添加忽略文件

  在我们写代码的时候,操作系统可能会自动生成一些隐藏文件,以及编译时产生的中间文件,或者一些软件生成的配置文件,如果将它们添加到远程库是不合适的,也是不正确的。那么,我们就需要告知Git,有哪些文件是忽略文件,不需要推送到远程库。向.gitignore文件中添加对应文件全名,即文件名.后缀名,然后将该文件推送到远程库即可。我们不需要自己一点一点写忽略文件,到官方忽略文件模板去选用合适的,然后整合起来产生自己的忽略文件即可。
  而有时我们需要添加一些特殊的文件,它们正好又在忽略文件目录中,就需要使用git add -f <file_name>命令强制添加了。或者你认为此类型的文件不该被忽略,则需要使用:git check-ignore -v <file_name>命令查看.gitignore文件的第几行的什么规则需要修改。请注意这里的<file_name>为文件全名,即:文件名.后缀名

配置别名

  有些命令十分长,每次打出来还得检查检查是否有误。这时候我们便需要给命令起别名。使用:git config [--global] alias.<another_name> <original_name>命令,为指定的original_name命令起一个指定的another_name别名。--global参数指在当前用户下使用该配置,会在本用户所有坏境下生效。不加此参数表示只在本仓库中生效。每个仓库的配置文件都放在.git/config文件中,在该文件的[alias]字段下存储别名信息,删除特定一行即可删除对应的别名规则。

异常集

git pull 失败,提示:fatal: refusing to merge unrelated histories

  两个根本不相干的 git 库, 一个是本地库, 一个是远端库, 然后本地要去推送到远端, 远端觉得这个本地库跟自己不相干, 所以告知无法合并。
  解决方法:
    第一种是把从远端库克隆下来,本地要加入的代码放到远端库克隆到本地的库, 然后提交上去 , 因为这样的话, 你基于的库就是远端在本地的库, 这是一次update了。
    第二种,使用git pull <repository_name> <branch_name> --allow-unrelated-histories命令强制推送,这会将本地和远程两个不相干分支进行强行合并。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值