【Tools】git操作总结
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_rsa
和id_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操作总结相关推荐
- 【Pycharm教程】代码调试、git操作、连接远程服务器
文章目录 零.Pycharm的安装 0.1 pycharm安装和pojie 0.2 pycharm的代码调试 一. Pycharm上传本地代码到github 1.1 pycharm连接github 1 ...
- linux内核源码git操作简单总结
有个老同事想快速查看不同版本的内核源码,问我有没有啥方法,当然有.大部分玩linux的小伙伴应该都知道从kernel/git/stable/linux.git - Linux kernel stabl ...
- git操作手册_基本的Git手册
git操作手册 介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you a little bit about ...
- 手把手教你熟悉Git操作
文章目录 Git 一.版本控制 二.Windows安装Git 1. Git 安装 2. Git 一次性配置 三.理解Git文件的三种状态与工作模式 四.创建版本库并提交文件 1. 初始化git 2. ...
- GitHub防黑客新措施:弃用账密验证Git操作,改用token或SSH密钥,今晚0点执行
萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还在用账户+密码对GitHub上的Git操作进行身份验证? 赶紧整个token(令牌)或SSH密钥吧! 8月14号0点(8月13日9:00 ...
- Git操作手册|命令速查表
Git操作手册|命令速查表 这篇文章主要介绍Git分布式版本管理与集中式管理的一些差异,总结下Git常用命令作为日后的速查表,最后介绍Git进阶的一些案例. 本文分为以下几个部分: Git与SVN差异 ...
- Git操作常用的命令都在这里了
转载自 Git操作常用的命令都在这里了 创建仓库 git init 在当前目录执行,会生成 .git目录文件,这个和SVN一致. 提交到仓库 git commit -m "first com ...
- git 修改分支名字_基础Git操作与GitHub协作吐血整理,收好!| 原力计划
作者 | 光子俊来源 | CSDN博客出品 | CSDN(ID:CSDNnews) Git介绍 Git是目前世界上最先进的分布式版本控制系统,可以为我们管理项目.构建工程.多人协作提供便利,作为一个爱 ...
- 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 ...
最新文章
- spring ioc的包的扫描(基于注解)
- C++代码片段(二)判断可变模板参数中是否包含某一特定类型
- trie树查找前缀串_Trie数据结构(前缀树)
- go语言一天入门(下)
- 聊聊天,如果能重来,还干不干程序员?
- Diaspora-v1.3.0 素锦WordPress博客主
- Java线程:新特征-线程池
- Asp.Net超时问题汇总
- C#算法练习,求e,求π
- 高并发架构消息队列面试题解析
- linux tick 函数,Linux上的GetTickCount函数
- T-SQL 小数点转换百分数
- eltable 无数据文案修改_element-table 无数据的时候,把“暂无数据” 改成其他文字或图片...
- 7号信令: TUP与ISUP的区别
- c语言php环境搭建,c语言从入门到放弃php从入门到放弃系列-01php环境的搭建
- python 科比投篮数据可视化及简单分析
- Ubuntu:安装yarn
- 网站建设教程:如何自己做网站,步骤有哪些?
- 思维的误区:忽视沉默的大多数
- mongoDB地理位置查询