Git(参考廖雪峰)
每标题下的代码块都有本小节要学到的全部命令行(便于查询)
本教程参考廖雪峰老师的网站教程
最官方权威的学习教程在这
创建版本库
git init
git add <file>
git commit -m <message>
- 添加readme.txt:用vscode编辑,Windows自带记事本会出现字符问题。
Git is a version control system.
Git is free software.
git init
初始创建repository
- 初始化一个Git仓库,使用
git init
命令。 - 添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
Time Machine
版本回退
git log
git relog
git reset --hard (commit id)
git log
或git log --pretty=oneline
查看版本提交日志信息。
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
- 回退到某个head版本:
git reset --hard HEAD^
此时HEAD版本就没了,时光倒退
- 但如果还记得此前版本号可以用命令
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
- 现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的
commit id
怎么办?在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
工作区和暂存组
git status//查看当前修改的信息状态
git add
在暂存区修改,git commit
一次性提交暂存区的所有修改到master分支。- 可以在工作区添加一个
LICENSE
文件 - 先在工作区修改
readme.txt
文件,然后用git status
查看当前状态
$ 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
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告诉我们,
readme.txt
被修改了,而LICENSE
还从来没有被添加过,所以它的状态是Untracked
。现在,使用两次命令
git add
,把readme.txt
和LICENSE
都添加后,用git status
再查看一下
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
modified: readme.txt
git修改逻辑是 在workspace修改要add进暂存区再commit,是分三个区域管理的,git跟踪存储的是修改记录。
修改管理撤销删除
git checkout -- <file> //检查是否和上一步一样并撤销
git reset HEAD <file> //撤销升级版之返回原点
git rm <file>
命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:- 一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; - 一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。- 一种是
git reset
之前是git reset --hard (commit id)
将工作区回退之前的版本,但用git reset HEAD <file>
可以将暂存区未commit的修改撤销并且将工作区回退HEAD
所表示的最新版本。
总结一下,我们工作需要三个过程,在工作区修改—>add加入暂存区—>commit提交暂存区修改到master,checkout帮我们撤销三步中上一步的操作,reset是可以从repository库master分支中撤回我们前面两步的操作。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
- 说一说删除,如果只是
rm
在工作区删除,add
加入暂存区也是一样效果 git rm
=rm
+add
,然后再commit。
远程仓库
ssh连接、上传、删除
ssh-keygen -t rsa -C "<邮箱>" //创建公钥
git remote add origin git@gitee.com:blacksevenbsw/xxx //此处参考自己的ssh地址
git push -u origin master //第一次添加-u直接将本地master的全部分支加入名叫origin的线上master里面
git push origin master //添加到线上,之后用这个就行
git remote rm <name> //删除,(不能真正删除,要登陆网站删除)
- 创建SSH key,执行下列代码(Shell或Git Bash)
ssh-keygen -t rsa -C "<邮箱>"
- 在user目录下找到.ssh文件:里面有
id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。 - 登陆github或gitee进入设置添加公钥。这样你的github或者gitee账户就允许这台电脑连接访问了。( •̀ ω •́ )✧
git remote add origin git@gitee.com:blacksevenbsw/xxx
git push -u origin master
把本地库的内容推送到远程,用
git push
命令,实际上是把当前分支master
推送到远程。由于远程库是空的,我们第一次推送
master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
git remote -v
git remote rm <name>
- 此处删除
-v
是查看远程库信息 - 此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub/GITEE,在后台页面找到删除按钮再删除。
克隆
git clone git@gitee.com:Blacksevenbsw/xxx
//这里加链接就行
ssh或http链接。
- Git支持多种协议,包括
https
,但ssh
协议速度最快。
分支管理
创建和合并
master是一条修改文件记录的时间线的主线,如果想获得分叉branch也是可以做到的。
git checkout -b dev //创建一条名叫dev的分叉
=
git branch dev //创建dev分支
+
git checkout dev //切转到这个分支
****************************************
git branch //查看当前分支
git merge dev //合并dev分支到目前切换的分支(有点像复制)
git branch -d dev //删除dev分支
//使用新的 switch命令,比checkout好理解
git switch -c dev //创建并切换
git switch master //切换到主线
解决冲突
如果修改完一个文件后commit,又切换分支后,接着修改同一个文件然后commit,再去合并就会出现冲突。
此时需要修改内容后,重新add再commit,接着合并就可以了。
流程如下:
git switch -c branch1
修改readme.txt......
git add readme.txt
git commit -m "blabla 1"
********切换分支*********
git switch master
修改readme.txt......
git add readme.txt
git commit -m "blabla2"
********准备合并*********
git merge branch1
出现冲突.......
修改保留文件内容.......
git add readme.txt
git commit -m “conflict fixed”
git log --graph //此命令查看分支合并图
分支管理
在合并举例中,在目前master上直接创建并转到新的分支比如branch1,接着修改commit后切回master再merge,就会出现fast forward模式合并,意思是切换回去的头指针HEAD直接将master的下一步指向dev,dev就不是原本的分支,加入到了master原定的主线里。
但在这里可以禁用fast forward模式的合并,这样的好处是在查看修改记录时就有了分支记录。如果是ff模式就查看不到曾经加过分支并且合并的记录。
git switch -c dev
修改文件.....
git add readme.txt
git commit -m "add merge"
git switch master
git merge --no-ff -m "merge" dev //禁用fast forward模式合并
//合并完成
//查看合并信息
git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
...
看的我热血沸腾啊https://www.ea55.com/
怎么收藏这篇文章?
某视频课代表
1、技能学习平台:哔哩哔哩、中国大学慕课、coursera、edX
2、软件操作:up主:oeasy、doyoudo、星月兮、Genji是真想教会你、旁门左道PPT、Excel自学成才、我是于干,+实战演练
3、编程:基础:菜鸟教程、进阶:CSDN、Github、stackoverflow、leetcode
4、英语:四六级尽早考+买真题,进阶:扇贝、中国日报网英语点津、Italki、Audible、NPR.org、考满分
5、二外:最好找老师,入门:多邻国
6、计算机二级:学校基础课、买题库,up主:小黑课堂计算机二级
7、其他:学吧导航
8、论文下载:学校图书馆或省市图书馆,知网、Web of Science、图书馆官网直接检索、SCI-HUB、Library Genesis、Z-Library
9、电子书:某宝、读秀、超星、书格、七彩英语、古腾堡计划、manybooks、鸠摩搜索、Library Genesis
10、PPT模板:OfficePLUS、PPT超级市场、51PPT模板、PPT汇、优品PPT、HiPPTer
还有一部分分支教程暂时用不到,那个比较复杂了对我来说=-=,之后再更