“Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Git有什么特点?简单来说就是:高端大气上档次!“ -------------------廖雪峰
————————————————————————————————————————————————————————
2018.8.22添加
// git bash生成ssh(我的是码云的)
ssh-keygen -t rsa -C "git@gitee.com:jxwacoolboy/Spring-Cloud-Config-Test.git"
// 查看生成的rsa秘钥
cat ~/.ssh/id_rsa.pub
// 第一次运行git先和版本库同步一下,会把服务器上的readme和license等同步到本地,不然直接提交会抱错
//git pull --rebase origin master
//初始化版本库
git init
// 本地commit之后会自动创建master分支,此后才能自己创建新的分支
git branch study_git01
// 切换到study_git01分支
git checkout study_git01
// git gui可以打开gui工具方便提交和同步
// 指定远程仓库
git remote add origin https://gitee.com/jxwacoolboy/Spring-Cloud-Config-Test.git
// 本地关联远程分支
git branch --set-upstream-to=origin/study_git01 study_git01
// 从远程仓库上拉取文件
git pull origin study_git01
// 有时会报错如下:
// fatal: refusing to merge unrelated histories
// 这是因为因为两个仓库不同,发现refusing to merge unrelated histories,无法pull,
// 要把两个不同的项目合并
git pull origin study_git01 --allow-unrelated-histories
————————————————————————————————————————————————————————
创建一个版本库:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd
命令用于显示当前目录。我的电脑上,这个仓库位于/Users/michael/learngit
。
然后,通过git init
命令把这个目录变成Git可以管理的仓库,然后你能在目录下看到一个空的仓库(empty Git repository),细心的可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
例如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
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")
上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
如果能看看具体修改了什么内容,,可以使用git diff这个命令看看(git diff是工作区(work dict)和暂存区(stage)的比较,而git diff -cached是暂存区(stage)和分支(master)的比较,暂存区(stage)是git add之后文件保存的一块区域,工作区(work dict)就是真正git commit之后文件提交到分支的。git diff --staged 暂存与仓库的差异【add之后,commit之前】,git diff commit_id_1 commit_id_2用来比较2个commit之间区别,git diff HEAD -- readme.txt
命令可以查看readme.txt文件在工作区和版本库里面最新版本的区别)
$ 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 reset
命令:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
HEAD^表示回退到上个版本,上上一个版本就是HEAD^^
,当然往上100个版本可以写成HEAD~100
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 log
命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数(另外,git log --oneline 和 git log --pretty=oneline的区别就是前者的id只显示7位)
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
git版本库分为暂存区和分支,暂存区实在执行git add 命令之后,将你的这一次修改加入到暂存区(git版本库管理的是修改而不是文件,也就是说暂存区存的是哪个文件进行了修改,并不知道具体改了什么),然后执行git commit之后,将暂存区的修改提交至版本库。也就是说,当你修改了一个文件没有执行git add时,执行git commit是不会把你这个修改提交的。
git checkout -- file
可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区;
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
当你使用删除文件test.txt ( rm test.txt ) 时,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了;现在你有两个选择,
一是确实要从版本库中删除该文件,那就用命令git rm
test.txt删掉,并且git commit
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout -- file
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
详细命令请查看:https://www.yiibai.com/git/git-quick-start.html