廖雪峰‘s Git
[TOC]
本人以后的博客转移到个人小站: https://www.kurby.top/ 本小站作为个人的生活、编程、胡思乱想等记录站点,欢迎大家来访问。
Git的诞生
先是因为CVS、SVN都是付费的,不符合开源精神,后来 BitKeeper 的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。 后来有个Linux的牛人把BitMove给破解了,所以LinuX无法免费使用了,Linus大佬用了两周时间用C写出了一个分布式的版本控制系统Git,此乃神人也~
Git的安装
Git下载,可以自己根据自己的操作系统选择,我为了方便用的是windows的,
安装完成后,运行git bash ,弹出一个命令行的东西,说明安装成功了。
|
|
创建版本库
创建一个文件夹、git init 把当前目录设置成Git可以管理的仓库:
$ mkdir learngit
$ cd learngit
$ git init
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
上传文件放到Git仓库
git add && git commit
第 一步,用命令git add
告诉Git,把文件添加到仓库:
$ git add readme.txt
第二步,用命令git commit
告诉Git,把文件提交到仓库:
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容:
Git is a distributed version control system.
Git is free software.
git status
现在,运行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
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
git diff
虽然Git告诉我们readme.txt
被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt
,所以,需要用git diff
这个命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed
单词。
知道了对readme.txt
作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add
:
$ git add readme.txt
同样没有任何输出。在执行第二步git commit
之前,我们再运行git status
看看当前仓库的状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
git status
告诉我们,将要被提交的修改包括readme.txt
,下一步,就可以放心地提交了:
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交后,我们再用git status
命令看看仓库的当前状态:
$ git status
On branch master
nothing to commit, working tree clean
git log
查看版本控制的记录
git log –pretty=oneline 就查看一行有那些版本
上图中的(HEAD ->master)表示的就是当前使用的版本
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
想要回到add something 要用
git reset –hard HEAD^ 表示要回到上一个版本
图中可以看到版本变成了 add something 的版本了
但是要注意的是咱们执行git log 只有2个版本了,add lpl的版本不见了!咋办很慌啊?
git reflog
可以记录咱们的git reset 的所有操作 ,我们只有git reset –hard xxx 就行了。
git checkout –
撤销更改的文件。 注意: 这里和git checkout 不一样 有 –
可以撤销已经git add file和git checkout – file的文件回到之前的状态
注意: 还可以用 git reset HEAD readme.txt 功能和git checkout – 一样的。
git rm xxx
添加了一个文件到版本库之后,如果这个文件删除了,那么git status的时候就会显示这个文件已经删除了,如果不要这个文件了,可以 git rm xxx 从本地版本库中删除xxx文件。
https://www.liaoxuefeng.com/wiki/896043488029600/900002180232448 学到
远程仓库
添加远程仓库
自己在github上创建一个仓库
现在,我们根据GitHub的提示,在本地的learngit
仓库下运行命令:
$ git remote add origin michaelliao/learngit.git
请千万注意,把上面的michaelliao
替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
问题:
1、git有时候会报这样的问题
|
|
解决方案是
git remote set-url命令修改remote URL
git remote set-url传递两个参数
- remote name。例如,origin或者upstream
- new remote url。例如,git@github.com:USERNAME/OTHERREPOSITORY.git
|
|
查看是否成功
|
|
2、 可能是本地命令行 ping github.com ping不同 ,是DNS的问题,可以从别人的电脑复制一个过来
https://blog.csdn.net/jackli_git/article/details/72861546
另外:重新定义origin的路径
|
|
从远程仓库克隆到本地
|
|
注意把Git库的地址换成你自己的,然后进入gitskills
目录看看,已经有README.md
文件了:
|
|
分支管理
git checkout -b xxx 或 git switch -c xxx
创建新的分支,然后切换到新分支
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
|
|
git branch xxx
创建xxx分支
git branch -d XXX
删除xxx分支
git branch
这个后面没有参数的就是查看当前所有的分支有什么, git branch
命令会列出所有分支,当前分支前面会标一个*
号。
git branch -d和git branch -D xxx
git checkout xxx 或 git switch xxx
切换到xxx分支
git merge
合并分支,这种是快进模式合并,速度快,并不是每次都能快速合并。
eg:先切换到master分支(也可以是其他分支)去,然后合并你想要合并的分支。
|
|
git log –graph
命令可以看到分支合并图。
git merge –no-ff xxx
不用Fast forward
模式进行合并分支。
上图的这种合并,就是--no-ff
这种合并方式,一个项目从黑色字的master分支,迭代了2个版本到黑色head处,现在想要把黑色的head合并到master,而且还有保存黑字master的版本,就要用--no-ff
这种合并方式。
git stash
我们更改了数据之后,如果想切换到另一个分支,就需要git add xx,然后git commit -m “xxxx”,先存一下,才能切换。
如果我们不想这么操作,可以用git stash,它会存到一个stash链表里,
|
|
git remote
查看远程分支的名称
git remote -v ———查看远程仓库的信息
git pull
如果其他人在git push origin xxx ,而且此时你也在git push origin xxx,就会出错,因为远程的内容比你的新,这时你就可以用,git pull把最新的提交从origin/dev抓下来,然后本地合并,解决问题,再推送。
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接:
|
|
再git pull,如果合并之后,可能会有问题,手动解决,然后再push。
git checkout -b branchName origin/branchName
在本地创建与远程一样的分支,
git checkout -b branchName则是在本地当前分支基础上创建分支。
git log –graph –pretty=oneline –abbrev-commit
查看分支结构。
git rebase
重新使git log –graph –pretty=oneline –abbrev-commit得到的分支变成一条直线。
git tag name
创建一个标签
|
|
.gitignore
忽略git的文件
如果文件被忽略了,可以使用git add -f xxx ,强制添加到git
git check-ignore -v xxx —–查看忽略的文件的规则
设置别名
|
|
git 出问题点
解决办法,重新生成ssh,ssh-keygen -t rsa -C “这里是你的git上注册的邮箱”,然后再c盘用户/.ssh中找到phg后缀的复制到github网页上的ssh认证即可。
可以参考链接:https://blog.csdn.net/xiejunna/article/details/86134683
本博客参考廖雪峰git教程:廖老师网站官网,非常感谢廖老师的分享。