小八学习git从0到基本运用
前言:
有一说一,刚刚步入计算机大二的我,这个Github在我的认知里面一直只是一个大牛从中copy代码的网站,我对其的了解也仅仅在于抖音的“黑马程序员”里面的人说的这个网站很多大牛,才会使用。
就在前几天,我收到了我的学长ConeZhang(名字都不透露了,后面简写:驰哥)给我发的几条信息。
看到这些消息,我直接开心的起飞,不知道怎么用语言来形容了,当时内心OS:woc!!这可是同时拿到百度,腾讯,快手sp甚至ssp的offer,最后去了字节的大佬啊,能带上我做项目,什么概念!!我上辈子肯定积了不少德,哈哈哈哈,说到驰哥,真就是机缘巧合,我还记得我第一次跟驰哥有了联系方式居然就在我预科刚入校的时候,因为学校教务系统的密码,忘记了,然后通过多方路径找到了驰哥的联系方式,然后帮我修改了密码,正巧我打算大一选择的就是计算机专业。
好了好了,言归正传,就在2021-11-26 18:33 驰哥给我发来了消息,要我赶紧这个周末学习完成,收到这个任务,我立刻马上关闭了LOL,开始了Git煎熬之旅。
Git的起源及比较:
我打开了驰哥发给我的学习网站,开始对Git的初步了解,发现原来Linux开发了Git及github网站,而Git与类似网站有不同之处就是,CVS以及SVN都是集中式的版本控制系统,但是Git是分布式的版本系统,但是集中式的系统最大毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要几十分钟,这还不得把人给憋死啊?
Git的安装以及创建远程仓库:
个人觉得真没什么好说的,用大一老师lq老师说的,不会就给我多安装几次就会了,要是电脑出问题了,就重装系统,一举多得,还能自学安装系统,要是看到这个博客的小伙伴,不知道怎么去安装,可以上我b大,或者在廖雪峰老师的网站进行学习,实在还是不会,可以加我的QQ奥。
Git的用法简介:
一、创建新的版本库
1.打开git bash找到一个非c盘的合适位置,来做创建一个空目录(我以d盘为例,创建一个文件夹learngit)
(输入语句里面含$)
$mkdir /d/learngit
$cd /d/learngit
$pwd /d/learngit
2.通过git init命令进行git仓库初始化
$git init
Initialized empty Git repository in D:/learngit/.git/
3.通过vi readme.txt创建一个新的文本框
$vi readme.txt
4.跳转到编辑界面,按下insert(ins)进行编辑,编辑完成之后按一下esc,再输入:wq进行退出(听我一个正在学Linux系统的室友告诉我,如果文档是只读的话,进行修改了的,就按:wq!进行强制退出)
5.用命令git commit告诉Git,把文件提交到仓库,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
$git commit -m”wrote a readme file “
[master (root-commit) df7ffd5] wrote a readme file
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
二、其他基本命令的使用
版本回退
1、git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上–pretty=oneline参数:
$ git log –pretty=oneline
2、现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:
$ git reset –hard HEAD^
在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
3、最新的那个版本append GPL已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是1094adb…,于是就可以指定回到未来的某个版本:
$ 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用来记录你的每一次命令:
4、$ git reflog查看命令历史,以便确定要回到未来的哪个版本。
管理修改
1、每次修改,如果不用git add到暂存区,那就不会加入到commit中。
2、git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别:
diff –git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
撤销修改
$ git status
On branch master
Changes not staged for commit:
(use “git add
(use “git checkout –
modified: readme.txt
no changes added to commit (use “git add” and/or “git commit -a”)
你可以发现,Git会告诉你,git checkout – file可以丢弃工作区的修改:
$ git checkout – readme.txt
2、现在假定是凌晨3点,你不但写了一些胡话,还git add到暂存区了:
庆幸的是,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:
Git同样告诉我们,用命令git reset HEAD
$ git reset HEAD readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用git status查看一下,现在暂存区是干净的,工作区有修改:
还记得如何丢弃工作区的修改吗?
$ git checkout – readme.txt
删除文件
1、一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
rm之后你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
rm ‘test.txt’
2、切记,在git rm 之后还需要提交commit才能从版本库中被删除
$ git commit -m “remove test.txt”
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
3、另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:(经实验,如果版本库里面也被rm了就无法恢复了)
$ git checkout – test.txt
远程库的使用
一、添加远程库
具体怎么添加,请小伙伴们,自行百度学习,具体实现就不说了,小编只在这里讲一下添加时候的一些命令:
1、在本次仓里面运行命令:
$ git remote add origin git@github.com:pengzihao166/learngit.git
注意:把上面的pengzihao166替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
2、下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
注意:由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
3、从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
二、删除远程库
1、如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm
$ git remote -v
origin git@github.com:pengzihao166/learn-git.git (fetch)
origin git@github.com:pengzihao166/learn-git.git (push)
然后,根据名字删除,比如删除origin:
$ git remote rm origin
三、从远程库克隆
1、准备好远程库
2、现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
$ git clone git@github.com:pengzihao166/gitskills.git
注意把Git库的地址换成你自己的,然后进入gitskills目录看看,已经有README.md文件了。
Git支持多种协议,包括https,但ssh协议速度最快。
分支管理
一、创建并合并分支
创建命令:
git switch -c ***
合并命令:
git merge ***
注意:***是你想取的名字
二、分支管理策略
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
例:
$ git merge –no-ff -m “merge with no-ff” dev
合并后,我们用git log看看分支历史:
$ git log –graph –pretty=oneline –abbrev-commit
二、bug和feature分支:
这两个分支总体来说用法都一样,就是在不同工作环境下使用的时间不一样,就拿bug来举例好了:
1、当你接到一个修复一个代号101的bug的任务时,当前正在dev上进行的工作还没有提交。
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
2、返回到主分支master之后,再建立一个新的分支issue-101,在此分支上面进行readme.txt文档的修改已知bug(经自己的实验发现一个问题,原来如果vi文件完成之后你使用前面提到的:wq或者wq!或者ZZ命令会发现,你的文件直接被git add了,只需要直接commit)
$ git add readme.txt
$ git commit -m “fix bug 101”
[issue-101 a1d6694] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
3、再修改bug完成之后,返回到master分支,然后,再进行git merge –no-ff -m “merged bug fix 101” issue-101合并刚刚的issue-101分支修改的bug内容
4、然后就是跳转到先前的Dev分支上面,继续以前的工作,通过git stash list 查找到刚刚git stash存好的工作区的文件,恢复方法如下:
输入git stash list
$ git stash list
stash@{0}: WIP on dev:ecd2437add merge
①一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
②$ git stash apply stash@{0}
stash@{0}就是list显示的前缀名
5、同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。
为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
$ git branch
dev(此时在dev分支上面)
master
$ git cherry-pick a1d6694
[master 1d4b803] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
标签管理:
一、创建标签:
1、直接法:
$ git branch
- dev
master$ git checkout master
Switched to branch ‘master’
然后,敲命令git tag
$ git tag v1.0
可以用命令git tag查看所有标签:
$ git tag
v1.0
2、默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
$ git log –pretty=oneline –abbrev-commit
12a631b (HEAD -> master, tag: v1.0, origin/master)
merged bug fix 101
4c805e2 fix bug 101
e1e9c68 merge with no-ff
f52c633 add merge
比方说要对add merge这次提交打标签,它对应的commit id是f52c633,敲入命令:
$ git tag v0.9 f52c633
再用命令git tag查看标签:
$ git tag
v0.9
v1.0
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show
$ git show v0.9
可以看到,v0.9确实打在add merge这次提交上。
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m “version 0.1 released” 1094adb
用命令git show
$ git show v0.1\
二、操作标签
命令git push origin
命令git push origin –tags可以推送全部未推送过的本地标签;
命令git tag -d
命令git push origin :refs/tags/
总结
今天的Git命令的使用,就到此结束了,要是有啥疑惑的小伙伴可以去自行百度或者加上我的联系方式,联系我奥。
部分内容转自廖雪峰老师的网站,如有侵权,请立刻联系小编进行修改完善。
---来自一个小白的真实学习笔记