1.申请 SSH Key
命令:
$ git config --global user.name "zhenglm"
$ git config --global user.email "578314999@qq.com"
$ ssh-keygen -t rsa -C "578314999@qq.com"
说明:前两个命令是 第一次打开 Git时,对本地环境的配置
第三个命令是 生成 ssh的Key生成的 ssh key是两个文件,在系统当前用户目录(C:\Users\zhenglm)下的 .ssh 目录下,其中 id_rsa.pub是公钥放在github上,id_rsa是私钥保留在本地就好。
因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的
2.将远程仓库拷贝到本地
命令:
$ git clone git@github.com:zhangyaoyuan/PkuJava31.git
3.将刚才拷贝到本地的项目的分支check到本地
命令:
$ git checkout -b 1501211044
Switched to a new branch '1501211044'
说明:将已经存在的 1501211044 分支checkout到本地了,并切换到分支Git checkout 命令加上 -b参数表示创建并且切换,相当于同时执行了两条命令
$ git branch 1501211044
$ git checkout 1501211044 --- 切换到 1501211044 分支
Switched to branch '1501211044'
在你切换到 1501211044 分支后,你此时提交的文档就相当于提交到了当前分支里面,在你将分支与主干(master)合并之前,并不会影响 master。
4.查看当前分支
可以让我们时刻掌握仓库当前的状态:
$ git branch
* 1501211044
Master
5.修改分支后提交分支
命令:
$ git add zlmtest.txt
$ git commit -m "branch test"
[1501211044 17d4022] branch test
1 file changed, 1 insertion(+)
create mode 100644 zlmtest.txt
第一条命令作用是把你新添加到分支的文件add到Git系统的索引库,第二条命令的作用是根据索引库内容提交(-m参数后跟的是提交时的说明信息)。如果你没有把新添加的文件先add的话,而是直接commit,那么会出现如下的提示:
Git add 命令的一点补充:
(1)git add <path> :表示将path中所有修改的和新添加的命令添加,不包括删除的文件。
(2)git add -u [<path>] :表示将path中所有tracked(之前已经添加过)的修改过的和删除的文件添加到索引库。不包括新建的文件。
(3)git add -A [<path>] :表示将path中所有tracked文件中被修改和删除的文件以及untracked文件信息添加到索引库。
(4)git add -i [<path>] :查看path中所有修改和已删除的文件。
6、将分支内容合并到 master
命令: MINGW64 ~/PkuJava31 (master)
$ git merge 1501211044
说明:git merge 命令的作用是合并某指定分支 到当前分支。所以如果要将1501211044分 支合并到 master必须要用 git checkout命令切换到 master分之后,再执行 git merge 1501211044 命令。
此时在 GitHub上还看不到新的提交后的结果,因为这只是对你本地副本的操作。
7、将合并到master的修改结果推送的远程主机GitHub
命令: MINGW64 ~/PkuJava31 (master)
$ git push origin master
说明:使用 git push命令将修改信息推送到远程主机,
格式:$ git push <远程主机名> <本地分支名>:<远程分支名>
远程主机名默认为 origin ,<本地分支名>是你要push的本地分支的名称,这里是master<远程分支名> 如果不填默认为本地分支对应的远程分支。
8.删除分支
命令:MINGW64 ~/PkuJava31 (1501211044)
$ git branch -d 1501211044
1. 查看修改的内容
第一天上班时,已经记不清上次怎么修改的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.
2.commit
“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
3 . 显示提交的历史记录
git log命令显示从最近到最远的提交日志
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
**4.commit 版本的回溯
(1)回退到上一个版本
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
(2)如果想在回去,需要版本的id号
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
(3)Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
**5.git的核心概念理解
1.工作区(Working Directory)
就是你在电脑里能看到的目录
2.版本库(Repository)
工作区有一个隐藏目录.git
提交流程
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
例子
先对readme.txt做个修改,比如加上一行内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
先用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
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# LICENSEno changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。
使用两次命令git add,把readme.txt和LICENSE都添加后,用git status
再查看一下:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: readme.txt#
暂存区的状态就变成这样了
执行git commit就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "understand how stage works"
[master 27c9860] understand how stage works 2 files changed, 675 insertions(+) create mode 100644 LICENSE
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
$ git status
# On branch masternothing to commit (working directory clean)
6. 查看工作区和版本库区别
git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别:最后两行
$ 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.
7. 撤销修改
(1)没有add
你在readme.txt中添加了一行:
$ cat readme.txtGit is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
你可以删掉最后一行,手动把文件恢复到上一个版本的状态。
$ 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会告诉你,git checkout -- file可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
(2).已经调用了add
$ cat readme.txt
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 of files.
My stupid boss still prefers SVN.
$ git add readme.txt
用git status查看一下,修改只是添加到了暂存区,还没有提交:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
用命令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
#no changes added to commit (use "git add" and/or "git commit -a")
最后丢掉工作区
$ git checkout -- readme.txt
$ git status
# On branch masternothing to commit (working directory clean)
(3)已经commit了 那么参考版本回退一节
如果已经push到了远程,那就真惨了
8.删除文件
在Git中,删除也是一个修改操作,先添加一个新文件test.txt到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master 94cdc44] add test.txt 1 file changed, 1 insertion(+) create mode 100644 test.txt
然后直接删除
$ rm test.txt
这个时候,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.txtrm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。但会丢失最近一次提交后你修改的内容