Git知识总结
Git知识总结
Git安装
windows
在git官网中下载安装程序,然后按默认选项安装即可
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
创建版本库
创建空目录
$ cd d:/github
$ mkdir test
$ cd test
$ pwd
/d/github/test
pwd用于显示当前目录通过
git init命令把这个目录变成Git可以管理的仓库$ git init
Initialized empty Git repository in D:/github/test/.git/
添加或修改版本库中文件
把文件添加到版本库
使用命令
git add <file>,注意,可反复多次使用,添加多个文件;$ git add readme.txt
使用命令
git commit -m <message>,完成。$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 1 insertions(+)
create mode 100644 readme.txt
-m后面输入的是本次提交的说明
修改版本库中的文件
修改文件后可按照添加文件时的相同操作将文件添加到版本库中
要随时掌握工作区的状态,使用
git status命令。修改文件后未
git add$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
git add后未git commit$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) modified: readme.txt
git commit后$ git status
On branch master
nothing to commit, working tree clean
如果
git status告诉你有文件被修改过,用git diff可以查看修改内容
版本回退
用
git log命令查看历史提交记录可以加上
--pretty=oneline参数显示关键信息$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
版本回退
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
HEAD表示当前版本,HEAD^表示上一版本,HEAD^^表示上上一版本上100个版本表示成
HEAD~100git reflog用来记录你的每一次命令,可以通过git reflog找到你所想要回退的版本对应的commit id 然后进行回退$ git reset --hard 1094a
这里 commit id可以不用写全,写前几位能够唯一对应即可
一般
git log用于回退到历史版本,git reflog用于回到先前或者未来版本
工作区与暂存区
工作区
电脑里能看到的目录,例如之前创建的test
版本库
工作区中的一个隐藏目录
.git,不算工作区,而是Git的版本库Git的版本库里存了很多东西,其中最重要的就是称为
stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用
git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
撤销修改
git checkout -- file可以丢弃工作区的修改$ git checkout -- readme.txt
命令
git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,让这个文件回到最近一次git commit或git add时的状态命令
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
已经提交了不合适的修改到版本库时,想要撤销本次提交,根据之前版本回退的知识,将版本回退到对应版本
删除文件
首先将文件通过文件管理器或者
rm命令删除$ rm test.txt
此时可以进行两种操作:
一种是确实要从版本库中删除该文件,先用命令
git rm删掉,并且git commit$ git rm test.txt
rm 'test.txt' $ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
令一种情况是删错了,可以通过版本库把误删的文件恢复到最新版本
$ git checkout -- test.txt
远程仓库
前置操作
创建SSH Key
打开Shell(Windows下打开Git Bash),创建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到
.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人登陆GitHub,添加SSH Key
点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
添加远程库
登录Github创建新仓库
将该仓库与本地仓库相关联
git remote add origin git@server-name:path/repo-name.git$ git remote add origin https://github.com/NoahQue/test.git
origin是远程库
把本地库的内容推送到远程库上
第一次推送时
$ git push -u origin master
加上
-uGit不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令之后推送时
$ git push origin master
删除远程库
用
git remote rm <name>命令删除远程库,可先用git remote -v查看远程库信息$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)
根据名字删除,比如删除origin
$ git remote rm origin
从远程库克隆
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆
在github将新仓库创建好后,用命令
git clone克隆一个本地库$ git clone git@github.com:michaelliao/gitskills.git
分支管理
创建与合并分支
创建
dev分支,然后切换到dev分支$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用
git branch命令查看当前分支$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号修改
dev分支中的文件后再提交,然后切换回master分支$ git checkout master
Switched to branch 'master'
切换回
master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变,之后我们把dev分支的工作成果合并到master分支上$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以放心地删除
dev分支$ git branch -d dev
Deleted branch dev (was b17d20e).
switch用法创建并切换到新的
dev分支$ git switch -c dev
直接切换到已有的
master分支$ git switch master
总结

解决冲突
如果不同分支对不同文件的修改不同,再
git merge合并时就有可能发生冲突,需要手动解决冲突后再提交。用git log --graph命令可以看到分支合并图分支管理策略
使用
-no-ff方式的git merge,禁用Fast forward$ git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上
--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并Bug分支
Git还提供了一个
stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用
git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用
git stash pop,恢复的同时把stash内容也删了:总结
- 当手头工作没有完成时,先把工作现场
git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场; - 在master分支上修复的bug,想要合并到当前dev分支,可以用
git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
- 当手头工作没有完成时,先把工作现场
Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过
git branch -D <name>强行删除。多人协作
推送分支
master分支是主分支,因此要时刻与远程同步dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bugfeature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开
抓取分支
先用
git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>推送自己的修改 - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并 - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功!
如果
git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。- 首先,可以试图用
Rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
$ git rebase
First, rewinding head to replay your work on top of it...
Applying: add comment
Using index info to reconstruct a base tree...
M hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
Applying: add author
Using index info to reconstruct a base tree...
M hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
标签管理
创建标签
首先,切换到需要打标签的分支上
$ git branch
* dev
master
$ git checkout master
Switched to branch 'master'
命令
git tag <name>就可以打一个新标签$ git tag v1.0
可以用命令
git tag查看所有标签$ git tag
v1.0
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 f52c633
可以用
git show <tagname>查看标签信息$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800 add merge diff --git a/readme.txt b/readme.txt
...
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
- 命令
git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id; - 命令
git tag -a <tagname> -m "blablabla..."可以指定标签信息; - 命令
git tag可以查看所有标签。
- 命令
操作标签
- 命令
git push origin <tagname>可以推送一个本地标签; - 命令
git push origin --tags可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>可以删除一个远程标签。
- 命令
Git知识总结的更多相关文章
- 【android Studio】零git知识、零脚本命令,即刻体验git版本管理魅力!
git的优点就不去多说了.阻碍咱新手体验它的唯一问题就是门槛太高,脚本看着像天书, 本文主要阐述的,就是如何在android studio上,也能像tfs那样,非常简单的操作,就能使用git进行版本管 ...
- Git知识总览(二) git常用命令概览
上篇博客我们从 git clone 和 git status 两个命令开始,引出了一系列的git操作命令, 请参见:<Git知识总览(一) 从 git clone 和 git status 谈起 ...
- Git知识总览(三) 分支的创建、删除、切换、合并以及冲突解决
前两篇博客集中的聊了git的一些常用命令,具体请参见<Git知识总览(一) 从 git clone 和 git status 谈起>.<Git知识总览(二) git常用命令概览> ...
- Git知识总览(四) git分支管理之rebase 以及 cherry-pick相关操作
上篇博客聊了<Git知识总览(三) 分支的创建.删除.切换.合并以及冲突解决>,本篇博客我们主要来看一下 rebase 变基相关的操作.rebase 操作和 merge 操作最终都可以达到 ...
- Git知识总览(一) 从 git clone 和 git status 谈起
本篇博客是整理git相关知识的第一篇,因为之前一直是用SourceTree对Git的命令行操作用的不是特别熟,于是乎过了一遍ProGit(链接:https://git-scm.com/book/zh/ ...
- git知识总结-1.git基础之git reference
1.前言 Git版本管理的内容,是一系列由40bytes SHA-1字符串所代表patch,而Git References,则是对这些字符串的引用(也可以理解为别名).为什么需要别名呢?因为这些字符串 ...
- 最近学到的Git知识,大厂的Git机制还是很方便的
本文首发于微信公众号:程序员乔戈里 转载请注明:https://blog.csdn.net/WantFlyDaCheng/article/details/102538508 一.两次的 git com ...
- Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...
- Git知识总览(六) Git分支中的远程操作实践
前几篇博客陆陆续续的讲了好多关于Git操作的内容,本篇博客仍然也不例外,不过本篇博客的主题是关于git的远程操作的.依照之前博客的风格,我们依然依托于LearningGitBranch中的相关内容来探 ...
随机推荐
- P5956-[POI2017]Podzielno【数学】
正题 题目链接:https://www.luogu.com.cn/problem/P5956 题目大意 \(B\)进制下,给出序列\(a\),\(a_i\)表示数字\(i\)有多少个.求一个最大的\( ...
- T-SQL——关于SQL打开Excel文件
目录 0. 背景说明 1. 安装Access Database Engine 1. SQL脚本 3. .net项目中通过Micsoft.ACE.oledb读取Excel文件 志铭-2021年10月1日 ...
- Vulnstack内网靶场1
最近发现了一个内网的靶场网站,简单配置一下网络就可以,不用自己搭建这么麻烦漏洞信息 (qiyuanxuetang.net) 环境配置 内网1靶场由三台机器构成:WIN7.2008 server.200 ...
- 图解Redis6中的9种数据结构,墙裂建议准备去面试的人先看(干货,建议收藏)
如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ...
- NC105 二分查找法
二分查找(一) 二分查找看似简单,但是有很多的细节要注意. 题目是牛客NC105,找到有序数组中第一个大于或者等于所查找的数字. 初步写了如下的代码: class Solution { public: ...
- Golang通脉之切片
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su ...
- javascript-jquery介绍
jquery优势 1.轻量级 2.强大的选择器 3.出色的DOM封装 4.可靠的事件处理机制 5.完善的Ajax 6.不污染顶级变量 7.出色的浏览器兼容 8.链式操作方式 9.隐式迭代 10.行为层 ...
- SpringCloud微服务实战——搭建企业级开发框架(二):环境准备
这里简单说明一下在Windows系统下开发SpringCloud项目所需要的的基本环境,这里只说明开发过程中基础必须的软件,其他扩展功能(Docker,k8s,MinIO,XXL-JOB,EKL,Ke ...
- C/C++ 数据类型 表示最大 最小数值 探讨
C/C++中存储数字格式有整型和浮点型 字符型数据本质上也是以整型存储 整型 对于整型数据,最大值最小值很好计算 先确定对应数据型在本地所占用的字节数,同一数据型由于系统或者编译器的不同,所占字节不同 ...
- [对对子队]测试报告Beta
一.测试中发现的bug BETA阶段的新bug 描述 提出者(可能需要发现者在会议上复现) 处理人 是否解决 第四关中工作区的循环语句拖动到组件区后成本的大小比原来不一样的问题 梁河览 何瑞 是 循环 ...