git操作总结

下载的工程带有子工程submodule:

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

git submodule update --init --recursive

即可将子模块内容下载下来。


常用的撤销操作

(1)撤销本地工作区修改:

git checkout -- <file>   撤销某个file文件修改
或
git checkout .    撤销全部文件的修改,但是不能把新增的文件删除。该命令是用版本库里的版本替换
工作区的版本,替换为上一次add的版本,就相当于撤销,无论工作区是修改还是删除,都可以“一键还原”。

(2)撤销已经add到暂存区的修改

git reset HEAD <file>
或
git reset HEAD .

(3)撤销已经commit到版本库中的修改

可参考 https://www.jianshu.com/p/c2ec5f06cf1a

git reset --soft HEAD^          # 把当前版本回退到上一个版本,会保留工作区修改,和暂存区修改,即只撤销commit操作,add后的内容和工作区的内容都不会撤销。
或
git reset (--mixed,该参数可省略) HEAD^        # 把当前版本回退到上一个版本,会保留工作区修改,即变为了add之前的状态。
或
git reset  commit_id      # 把当前版本回退到commit_id版本号,会保留工作区修改,变为了add之前的状态
或
git reset --hard commit_id      # 把当前版本回退到某个版本号,会把工作区的所有文件都变回为 commit_id 版本,不会保留工作区修改
或
git reset --hard HEAD^          # 把当前版本回退到上一个版本,不会保留工作区修改。

解决冲突的操作步骤

解决冲突之后需要add和commit一遍,还是只需要commit一遍?应该是add+commit吧
先add,再commit,然后才能 git pull --rebase origin 远程分支名,不add,或者不commit,就不可能pull成功。
git pull --rebase origin 远程分支名后会有冲突,解决冲突之后使用 git rebase --continue
然后再 git commit --amend --no-edit这样就不用重新编辑commit信息,(此时不需要再执行git pull --rebase origin 远程分支名了),然后再 git push origin 本地分支:远程分支

git diff

git diff commit_id file_name   查看file_name文件和commit_id提交的不同
git diff branch_name file_name  查看file_name文件在本分支和branch_name分支的不同

覆盖已经push到远程仓库分支的提交内容 --force-with-lease

当我们push到远程分支后,发现有问题想修改却又想去掉远程仓库的本次提交,并且此时没有别人向远程分支push过内容,就可以使用下面的命令

git reset commit_id      # 这个id是上一次的(别人)提交的id,撤销已commit的修改
git add file            # 把修改的文件再重新add一遍
git commit -m "mesage"        # 这里的commit消息可以与我们想要覆盖的消息不一样,执行下面的最后一步后覆盖掉之前的提交的的
git push origin branch_name --force-with-lease  # 直接git push origin branch_name会被rejected,加上--force-with-lease就可以成功推送然后覆盖远程的提交而不产生一个新提交。

禁止使用git push --force来推送,因为这样强制推送会覆盖掉别人远程的提交,造成

只提交一部分修改文件,另一部分修改文件不提交

将需要提交的修改文件 git add file_1 file_2,然后git commit -m "message",剩下的不想提交的都git stash``,然后git pull --rebase,然后git push,最后再git stash pop```就可以弹出之前没有提交的文件,并且这些文件中我们修改过的部分还在。

配置

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

git diff可以查看修改内容
git diff readme.txt

版本回退

版本回退主要两个命令:

git reset --hard HEAD^      # 把当前版本回退到上一个版本

git reset --hard commit_id      # 把当前版本回退到某个版本号

详细解释如下:
在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,我们要把当前版本回退到上一个版本,就可以使用git reset命令:

git reset --hard HEAD^

HEAD指向的版本就是当前版本,HEAD^指向的版本就是上一个版本.

Git允许我们在版本的历史之间穿梭,使用命令:

git reset --hard commit_id

commit id(版本号)是一大串类似1094adb…

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区、暂存区、版本库

工作区就是本地修改的文件,在电脑里能看到的目录,比如我的study-cidi文件夹就是一个工作区;

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支;

版本库包含暂存区stage和master分支和Head指针,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

撤销修改

(1)命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销。命令中的两个横杠--很重要,没有--,就变成了“切换到另一个分支”的命令。git checkout -- readme.txt其实是用版本库里的版本替换工作区的版本,替换为上一次add的版本,就相当于撤销,无论工作区是修改还是删除,都可以“一键还原”。

(2)命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区,如:
git reset HEAD readme.txt可把已经add到暂存区的文件修改撤销掉。

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时:

用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改:

分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作:

git reset HEAD <file>   # 把已经```add```到暂存区的文件修改撤销掉,这一步后只剩下工作区的修改了
git checkout -- file    # 把file文件在工作区的修改全部撤销。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库:

版本回退主要两个命令:

git reset --hard HEAD^      # 把当前版本回退到上一个版本

git reset --hard commit_id      # 把当前版本回退到某个版本号
(1)撤销本地工作区修改:
git checkout -- <file>   撤销某个file文件
或
git checkout .    撤销全部文件的修改,但是不能把新增的文件删除。该命令是用版本库里的版本替换工作区的版本,替换为上一次add的版本,就相当于撤销,无论工作区是修改还是删除,都可以“一键还原”。
(2)撤销已经add到暂存区的修改
git reset HEAD <file>
或
git reset HEAD .
(3)撤销已经commit到版本库中的修改
git reset --hard HEAD^          # 把当前版本回退到上一个版本
或
git reset --hard commit_id      # 把当前版本回退到某个版本号

删除文件

  当你把文件git add test.txt添加到版本库后,想要删除该文件,可以 rm test.txt,也可以手动删除,然后Git知道你删除了文件,因此,工作区和版本库就不一致了,接下来就需要在版本库中删除test.txt,使用git rm test.txt,注意这两个命令加不加git是有差别的。要从版本库中删除该文件,那就用命令git rm test.txt删掉,并且git commit -m 'msg'.

当你rm删错某个文件了(不是git rm),因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout -- test.txt

git checkout -- test.txt其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

SSH

    为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
  Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

    第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

  第2步:登陆GitHub,打开“Account settings”“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容.点“Add Key”,你就应该看到已经添加的Key.

关联远程库

要关联一个远程库,使用命令

git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

分支

Git鼓励大量使用分支:

1.查看分支:git branch

2.创建分支:git branch <name>

3.切换分支:git checkout <name>
注意区分git checkout -- readme.txt是撤销工作区修改的指令,不要混淆了

4.创建+切换分支:git checkout -b <name>

相当于执行下面这两条命令:

git branch <name>
git checkout <name>

5.合并某分支到当前分支:git merge <name>

6.删除分支:git branch -d <name>

7.查看分支合并图:git log --graph
每个历史一行:git log --graph --pretty=oneline
每个历史一行,并且commit_id使用缩略:git log --graph --pretty=oneline --abbrev-commit

8.查看命令历史:git reflog

合并分支 和 Fast forward

需要把某个分支branch-1合并到另一个分支branch-2,需要先切换到branch-2:git checkout branch-2,然后再合并git merge branch-1即可。

git checkout master
git merge dev

上面这种合并分支时,由于当前 master 分支所在的提交对象是要并入的 dev 分支的直接上游,Git 只需把 master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。

  合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:

git merge --no-ff -m "merge with no-ff" dev

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支(例如:我的是zhuhz分支),时不时地把(zhz分支)往dev分支上合并即可,不要合并到master。

bug分支

之所以用到git stash暂存工作现场,而不提交,并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作.

疑问:为什么不add一下,并不commit,这样不行吗?还是说add之后就会把所有的各个分支上add的东西都放在了一起,你下次在add别的分支上的修改之后add了commit,也会把我现在这个分支上的修改给一起commit?记得试验一下。弄懂原因。

git stash
git stash list

Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了.

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit_id>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

修改最近一次的commit内容

git commit --amend

然后会自动在用默认编辑器vim中打开一个文件COMMIT_EDITMSG,修改第一行信息即可。如果是默认vim,那不会有问题,如果是默认是gedit,这种方法没用,只能改为默认用vim编辑,方法是git config --global core.editor vim

git commit -am "haha"

等价于下面两条命令:

git add .
git commit -m "haha"

【Tools】git操作总结相关推荐

  1. 【Pycharm教程】代码调试、git操作、连接远程服务器

    文章目录 零.Pycharm的安装 0.1 pycharm安装和pojie 0.2 pycharm的代码调试 一. Pycharm上传本地代码到github 1.1 pycharm连接github 1 ...

  2. linux内核源码git操作简单总结

    有个老同事想快速查看不同版本的内核源码,问我有没有啥方法,当然有.大部分玩linux的小伙伴应该都知道从kernel/git/stable/linux.git - Linux kernel stabl ...

  3. git操作手册_基本的Git手册

    git操作手册 介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you a little bit about ...

  4. 手把手教你熟悉Git操作

    文章目录 Git 一.版本控制 二.Windows安装Git 1. Git 安装 2. Git 一次性配置 三.理解Git文件的三种状态与工作模式 四.创建版本库并提交文件 1. 初始化git 2. ...

  5. GitHub防黑客新措施:弃用账密验证Git操作,改用token或SSH密钥,今晚0点执行

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还在用账户+密码对GitHub上的Git操作进行身份验证? 赶紧整个token(令牌)或SSH密钥吧! 8月14号0点(8月13日9:00 ...

  6. Git操作手册|命令速查表

    Git操作手册|命令速查表 这篇文章主要介绍Git分布式版本管理与集中式管理的一些差异,总结下Git常用命令作为日后的速查表,最后介绍Git进阶的一些案例. 本文分为以下几个部分: Git与SVN差异 ...

  7. Git操作常用的命令都在这里了

    转载自 Git操作常用的命令都在这里了 创建仓库 git init 在当前目录执行,会生成 .git目录文件,这个和SVN一致. 提交到仓库 git commit -m "first com ...

  8. git 修改分支名字_基础Git操作与GitHub协作吐血整理,收好!| 原力计划

    作者 | 光子俊来源 | CSDN博客出品 | CSDN(ID:CSDNnews) Git介绍 Git是目前世界上最先进的分布式版本控制系统,可以为我们管理项目.构建工程.多人协作提供便利,作为一个爱 ...

  9. Git操作失败并提示Another git process seems to be running in this......

    问题: Git操作的过程中突然显示Another git process semms to be running in this repository, e.g. an editor opened b ...

最新文章

  1. spring ioc的包的扫描(基于注解)
  2. C++代码片段(二)判断可变模板参数中是否包含某一特定类型
  3. trie树查找前缀串_Trie数据结构(前缀树)
  4. go语言一天入门(下)
  5. 聊聊天,如果能重来,还干不干程序员?
  6. Diaspora-v1.3.0 素锦WordPress博客主
  7. Java线程:新特征-线程池
  8. Asp.Net超时问题汇总
  9. C#算法练习,求e,求π
  10. 高并发架构消息队列面试题解析
  11. linux tick 函数,Linux上的GetTickCount函数
  12. T-SQL 小数点转换百分数
  13. eltable 无数据文案修改_element-table 无数据的时候,把“暂无数据” 改成其他文字或图片...
  14. 7号信令: TUP与ISUP的区别
  15. c语言php环境搭建,c语言从入门到放弃php从入门到放弃系列-01php环境的搭建
  16. python 科比投篮数据可视化及简单分析
  17. Ubuntu:安装yarn
  18. 网站建设教程:如何自己做网站,步骤有哪些?
  19. 思维的误区:忽视沉默的大多数
  20. mongoDB地理位置查询

热门文章

  1. 一张图看懂新一代人工智能知识体系
  2. 如何基于Redis Replication设计并实现Redis-replicator?
  3. 如何做好一款爬虫产品
  4. Linux 信号signal处理函数--转
  5. 【风控系统】风控中心—京东基于Spark的风控系统架构实践和技术细节
  6. GitHub 上有哪些好用的爬虫?
  7. 张首晟:用科学思维指导投资
  8. Caffe部署中的几个train-test-solver-prototxt-deploy等说明二
  9. 海康威视:增速超预期 调高盈利预测
  10. 实战并发编程 - 09多线程Guarded Suspension模式案例实战