本人个人博客www.kurby.top 欢迎访问。以后博客都会同步到个人博客和CSDN上,CSDN只作为技术的分享,个人博客会多一些内容,当做我个人的小屋。如有兴趣,欢迎访问。
先是因为CVS、SVN都是付费的,不符合开源精神,后来 BitKeeper 的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。 后来有个Linux的牛人把BitMove给破解了,所以LinuX无法免费使用了,Linus大佬用了两周时间用C写出了一个分布式的版本控制系统Git,此乃神人也~
Git下载,可以自己根据自己的操作系统选择,我为了方便用的是windows的,
安装完成后,运行git bash ,弹出一个命令行的东西,说明安装成功了。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
创建版本库
创建一个文件夹、git init 把当前目录设置成Git可以管理的仓库:
$ mkdir learngit
$ cd learngit
$ git init
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
第 一步,用命令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
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." 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告诉我们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 ..." 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 --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 reset 的所有操作 ,我们只有git reset --hard xxx 就行了。
撤销更改的文件。 注意: 这里和git checkout 不一样 有 –
可以撤销已经git add file和git checkout – file的文件回到之前的状态
注意: 还可以用 git reset HEAD readme.txt 功能和git checkout – 一样的。
添加了一个文件到版本库之后,如果这个文件删除了,那么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有时候会报这样的问题
ERROR: Repository not found.fatal: Could not read from remote repository. Please make sure you have the correct access rightsand the repository exists.
解决方案是
git remote set-url命令修改remote URL
git remote set-url传递两个参数
git remote set-url origin [email protected]:xxxxxx/xxxxxx.git
$ git remote -v origin
https:YourUserName/YatouTest00123.git (fetch)origin https:YourUserName/YatouTest00123.git (push)
2、 可能是本地命令行 ping github.com ping不同 ,是DNS的问题,可以从别人的电脑复制一个过来
https://blog.csdn.net/jackli_git/article/details/72861546
$ git remote set-url origin [email protected]:Kurby96/test.git
$ git clone [email protected]:michaelliao/gitskills.git
注意把Git库的地址换成你自己的,然后进入gitskills
目录看看,已经有README.md
文件了:
$ cd gitskills
$ ls
README.md
创建新的分支,然后切换到新分支
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
创建xxx分支
删除xxx分支
这个后面没有参数的就是查看当前所有的分支有什么, git branch
命令会列出所有分支,当前分支前面会标一个*
号。
git branch -d和git branch -D xxx
切换到xxx分支
合并分支,这种是快进模式合并,速度快,并不是每次都能快速合并。
eg:先切换到master分支(也可以是其他分支)去,然后合并你想要合并的分支。
$ git checkout master
$ git merge dev
命令可以看到分支合并图。
不用Fast forward
模式进行合并分支。
上图的这种合并,就是--no-ff
这种合并方式,一个项目从黑色字的master分支,迭代了2个版本到黑色head处,现在想要把黑色的head合并到master,而且还有保存黑字master的版本,就要用--no-ff
这种合并方式。
我们更改了数据之后,如果想切换到另一个分支,就需要git add xx,然后git commit -m “xxxx”,先存一下,才能切换。
如果我们不想这么操作,可以用git stash,它会存到一个stash链表里,
$ git stash list ----查看当前存储的东西
$ git stash apply ---恢复stash内容不删除
$ git stash drop ----删除
$ git stash pop -----恢复的同时,内容也清除
$ git stash apply stash@{0} -----恢复指定的stash 括号内是list的顺序
查看远程分支的名称
git remote -v ---------查看远程仓库的信息
如果其他人在git push origin xxx ,而且此时你也在git push origin xxx,就会出错,因为远程的内容比你的新,这时你就可以用,git pull把最新的提交从origin/dev抓下来,然后本地合并,解决问题,再推送。
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接:
$ git branch --set-upstream-to=origin/dev dev
再git pull,如果合并之后,可能会有问题,手动解决,然后再push。
在本地创建与远程一样的分支,
git checkout -b branchName则是在本地当前分支基础上创建分支。
查看分支结构。
重新使git log --graph --pretty=oneline --abbrev-commit得到的分支变成一条直线。
创建一个标签
git tag -----打标签
git tag -a -m "blablabla..." -----可以指定标签信息
git tag ----查看标签信息
git tag -d v0.1 ----删除标签
git push origin -----推送标签到远程
git push origin --tags ------推送本地所有标签到远程
如果标签已经推送到远程,要删除,需要从本地和远程分别删除
git tag -d v0.1 --本地删除
git push origin :refs/tags/v0.1 --远程删除
忽略git的文件
如果文件被忽略了,可以使用git add -f xxx ,强制添加到git
git check-ignore -v xxx -----查看忽略的文件的规则
$ git config --global alias.st status ----其中st 是status的别名
h origin -----推送标签到远程
git push origin --tags ------推送本地所有标签到远程
如果标签已经推送到远程,要删除,需要从本地和远程分别删除
git tag -d v0.1 --本地删除
git push origin :refs/tags/v0.1 --远程删除
#### .gitignore
忽略git的文件
如果文件被忽略了,可以使用git add -f xxx ,强制添加到git
git check-ignore -v xxx -----查看忽略的文件的规则
### 设置别名
```sh
$ git config --global alias.st status ----其中st 是status的别名
本博客参考廖雪峰git教程:廖老师网站官网,非常感谢廖老师的分享。