创建仓库,添加文件到仓库
1.本地创建仓库,进入该仓库
$mkdir my_repo
$cd my_repo
2.初始化仓库
$git init
可以看到my_repo下多了一个.git文件
如果没有的话,选择查看,勾选显示隐藏的项目(因为”.”开头的文件是隐藏文件)
3.创建一个新的文本文件
$vim readme.txt
往readme.txt中写入内容,我这里写入的是“first write”
4.将新文件添加到仓库
注意:在git中有一个暂存区,所有add操作,都是将文件放到暂存区。
$git add readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
5.提交到仓库
注意:commit就是将暂存区的内容提交到当前分支中
$git commit - m “first write”
[master (root-commit) be2fbbb] first write
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
-m 后面的内容,是对本次提交的说明
也可以一次提交多个文件,如下
$git add file1.txt
$git add file2.txt
$git add file3.txt
$ git commit -m “add three files”
[master 4c66b1d] add three files
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1.txt
create mode 100644 file2.txt
create mode 100644 file3.txt
版本控制
1.修改readme.txt
vim readme.txt
first write
I modified this file
添加“I modified this file”到readme.txt
2.添加修改后的文件到仓库
修改文件后,可以用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 add readme.txt
$git commit -m “first modified”
再修改文件,添加“try second modified”到文件,和上面一样添加提交
$git add readme.txt
$git commit -m “second modified”
3.git log来查看历史记录
$ git log
commit db7532e4607e3c38c26572f174aad96b56bf764f (HEAD -> master)
Author: yuajuan [email protected]
Date: Wed Jan 10 10:23:08 2018 +0800
second modified
commit ea1d64f2233b25b05f2b2152fa3f3d86d986926b
Author: yuajuan [email protected]
Date: Wed Jan 10 10:22:02 2018 +0800
first modified
commit 4c66b1d72e586763fa3e1054b605981c7ece1865
Author: yuajuan [email protected]
Date: Wed Jan 10 10:11:00 2018 +0800
add three files
commit be2fbbb9b5e07549742152dc38d74b880b0b54b5
Author: yuajuan [email protected]
Date: Wed Jan 10 10:08:50 2018 +0800
first write
在这里我们可以看到在仓库中的每一个版本情况
commit后面的一串就是commit id。
使用下面的命令可以让显示更加简洁
$git log –pretty=oneline
$ git log –pretty=oneline
db7532e4607e3c38c26572f174aad96b56bf764f (HEAD -> master) second modified
ea1d64f2233b25b05f2b2152fa3f3d86d986926b first modified
4c66b1d72e586763fa3e1054b605981c7ece1865 add three files
be2fbbb9b5e07549742152dc38d74b880b0b54b5 first write
4.回退到上一个版本
Git必须知道当前版本是哪个版本,在Git中用HEAD表示当前版本
$ git reset –hard head^
HEAD is now at ea1d64f first modified
可以看到这里ea1664f就是上面git log下的第二行,这里已经回退到上一个版本。
如果想回退到上上个版本,就是 git reset –hard head^^。要回退到上100个版本,当然不是写
100个^啦,只需要 git reset –hard head~100就好啦。
(使用commit id时,可以不用写全,写出前面一部分,能够唯一标识就好了,git会自动去查找匹配的id)
现在,再来看看历史记录
$ git log –pretty=oneline
ea1d64f2233b25b05f2b2152fa3f3d86d986926b (HEAD -> master) first modified
4c66b1d72e586763fa3e1054b605981c7ece1865 add three files
be2fbbb9b5e07549742152dc38d74b880b0b54b5 first write
恐慌!刚刚的”second modified“不见了,我想回到之前那个版本该怎么办!
git reset –hard commitId
直接使用这条命令就好啦,但是我们怎么知道commitId呢。
如果这个git窗口你还没关闭的话,翻一翻前面的记录就能找到”second modified”的id是db7532e46,那么我们直接git reset –hard db7532e46 就好了。
如果你关闭了之前的窗口,那么用下面的命令,可以看到你的每一次命令
$ git reflog
ea1d64f (HEAD -> master) HEAD@{0}: reset: moving to head^
db7532e HEAD@{1}: commit: second modified
ea1d64f (HEAD -> master) HEAD@{2}: commit: first modified
4c66b1d HEAD@{3}: commit: add three files
be2fbbb HEAD@{4}: commit (initial): first write
第二行就能看到提交“ second modified”的版本号啦!
撤销修改和删除文件git chekout
git checkout就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以还原。
撤销修改主要用到git chekout
分两种情况:
第一种是在工作区做了修改,即git add 命令之前。
执行 git checkout – readme.txt
那么readme.txt会恢复到上次执行git commit命令的状态。
第二钟是提交到暂存区后做了修改,即git add命令之后。
执行执行 git checkout – readme.txt
那么readme.txt会恢复到上次执行git add命令的状态。
删除文件
删除工作区的文件
$ rm readme.txt
恢复工作区的文件
$git checkout – readme.txt
删除版本库中的readme.txt
$git re readme.txt
远程仓库
1.创建SSH Key
在用户目录下,查看是否有.ssh目录,如下:
如果没有的话,在cmd中执行命令ssh-keygen -t rsa –C “[email protected]”
id_rsa是私钥,id_rsa.pub是公钥。
我们要将这个公钥配置到github的账号上。
登陆到github上,然后按照下面操作:
2.在github上创建一个库test
3.添加远程库
$ git remote add origin [email protected]:yuajuan/test.git
注意:需要将上面的yuajuan换成你自己的github用户名,并把test换成你自己仓库名
这里origin即为这个远程库的名称
3.把本地库的所有内容推送到远程库上
$git push -u origin master
查看远程库
$git remote
$git remote -v #查看更详细的信息
可以到github上的test库下查看,本地git库中的文件已经push进去了。
从远程库克隆文件到本地库
只需要 git clone [email protected]:username@repo_name 即可
分支管理
branch命令总结
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
之前的操作都只有一个master分支
现在创建一个develop分支,并切断到该分支下工作
$ git checkout -b develop
Switched to a new branch ‘develop’
在工作区创建文件的file_dev.txt,add后再commit
$ git add file_dev.txt
$ git commit -m “add file_dev to develop”
[develop 6a9c101] add file_dev to develop
1 file changed, 1 insertion(+)
create mode 100644 file_dev.txt
现在切换回master
$git checkout master
查看master分支中的提交的文件
$git ls-files
发现并没有file_dev.txt这个文件,那是因为我们是在develop分支中提交的,所以并不会影响到master。
下面合并develop分支到master
$ git merge develop
Updating 1ca0d91..6a9c101
Fast-forward
file_dev.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 file_dev.txt
合并完成后,可以删除develop分支
合并冲突
上面的例子,在合并时,是Fast-forward,即快速合并。
并不是每次合并都能完美进行,有时候会出现冲突
现在创建一个新的分支test1
$git checkout -b test1
在file_dev.txt最后一行添加
test1 branch add something
test1分支提交
$git add file_dev.txt
$git commit -m “add something”
切换到master分支
$git checkout master
在file_dev.txt最后一行添加
master branch add something
master 分支提交
$git add file_dev.txt
$git commit -m “add something”
在master分支上合并test1分支
$ git merge test1
Auto-merging file_dev.txt
CONFLICT (content): Merge conflict in file_dev.txt
Automatic merge failed; fix conflicts and then commit the result.
提示file_dev.txt出现冲突