一、Git的安装
git的安装很简单,不介绍。
安装好后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
二、创建版本库
首先,选择一个合适的地方,创建一个空目录。
$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit
通过git init 命令把这个目录变成Git可以管理的仓库
$ git init Initialized empty Git repository in /Users/michael/learngit/.git/
文件一定放在仓库目录下。例如:将readme.txt文件放到Git仓库中
第一步,用命令git add 告诉Git,把文件添加到仓库
$ git add readme.txt
第二步,用命令git commit告诉Git,把文件提交到仓库
$ git commit -m "wrote a readme file" [master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
简单解释一下 git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit 可以一次提交很多文件,因此,可以多次add不同文件
三、内容修改
提交后,又修改了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 no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,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.
最后,再做添加add和提交commit,提交前可以在查看一下
四、版本回退
在Git中,git log命令可以查看最近到最远的提交日志
$ git log commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 21:06:15 2018 +0800 append GPL commit e475afc93c209a690c39c13a46716e8fa000c366 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
如果不想输出信息太多,可以加上--pretty=oneline参数:
$ git log --pretty=oneline 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL e475afc93c209a690c39c13a46716e8fa000c366 add distributed eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
前面一串数字为版本号,每次提交一个新版本,Git就会把它们自动串成一条时间线。
回退版本:
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
$ git reset --hard HEAD^ HEAD is now at e475afc add distributed
还可以继续回退到上一个版本wrote a readme file
,不过且慢,然我们用git log
再看看现在版本库的状态:
$ git log commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master) Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
这里没有最新版本了,但还是可以回到最新的那个的,找到那个版本号就行。
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 reset --hard 1094a HEAD is now at 83b0afe append GPL
如图为理解图:
五、工作区和暂存区
工作区:就是你的电脑能看到的目录
版本库:工作区有一个隐藏目录.git,这个是Git版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
六、管理修改
Git管理的是修改,而不是文件。可以看一下下面这个过程:
第一次修改 -> git add
-> 第二次修改 -> git commit,然而第二次修改并没有被修改
解释:当你用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
七、撤销修改
如果需要撤销修改,可以自己手动把文件恢复到上一个修改前的状态。
第一种,在没有git add前,你可以使用git checkout -- file
可以丢弃工作区的修改。
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
第二种,你已经git add 后,并没有git commit,可以用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。再用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
$ git checkout -- readme.txt $ git status On branch master nothing to commit, working tree clean
八、删除文件
在Git种,删除也是一个修改操作。当你把一个文件删除后,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了:
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: test.txt no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
:
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test.txt" [master d46f35e] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
九、远程仓库
1、注册Github账号
2、创建SSH Key。
$ ssh-keygen -t rsa -C "youremail@example.com"
一路回车,最后可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
3、登录Github,打开“settings”,“SSH Keys”页面。将公钥添加进去。
十、添加远程仓库
目前,在GitHub上的这个新仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
关联远程仓库
$ git remote add origin git@github.com:KBoss174/Angular.git
请千万注意,你自己的GitHub账户名(这是我的账户名KBoss174),否则,你在本地关联的就是我的远程库,将会无法推送。添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
把本地仓库的内容推送到github
$ git push -u origin master The authenticity of host 'github.com (52.74.223.119)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts. Enumerating objects: 75, done. Counting objects: 100% (75/75), done. Delta compression using up to 8 threads Compressing objects: 100% (72/72), done. Writing objects: 100% (75/75), 208.63 KiB | 565.00 KiB/s, done. Total 75 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), done. To github.com:KBoss174/Angular.git * [new branch] master -> master Branch 'master' set up to track remote branch 'master' from 'origin'.
十一、从远程库克隆
使用命令git clone可以克隆一个本地库:
$ git clone git@github.com:KBoss174/Angular.git
来源:https://www.cnblogs.com/kadaj174/p/11046272.html