基本操作
-
git init
: 初始化 -
git add file
: 添加 -
git commit -m ""
: 提交 -
git status
查看哪些被修改,是否被提交 -
git diff filename
: 查看修改了什么内容
readme.txt
Git is a version control system.
Git is free software.
修改后的readme.txt
Git is a distributed version control system.
Git is free software.
- git status:
1.刚刚编辑完成
$ 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")
2.执行完add操作后:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
3.执行完commit
$ git status
On branch master
nothing to commit, working tree clean
- 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 log [--pretty=oneline]
看到最近的修改和commit[一行显示简化结果]
$ git log
commit 7cc923c7c82f59baef45bad87a7fe92372141f31 (HEAD -> master)
Author: wangchao <twilight@0402.com>
Date: Tue Aug 6 11:05:59 2019 +0800
add GPL
commit f620929dc0099452ccbfd74f24627492488018e9
Author: wangchao <twilight@0402.com>
Date: Tue Aug 6 10:51:26 2019 +0800
add distributed
commit b09dc7d79bea6543be0491bd3779f561b25ec435
Author: wangchao <twilight@0402.com>
Date: Tue Aug 6 10:50:17 2019 +0800
wrote a readme file
git中,HEAD
表示当前版本,HEAD^
表示前一个版本,HEAD^^
表示上上一个版本,上100各版本表示为HEAD~100
,HEAD
其实是一个指针,回退版本其实就是移动指针。回退到上一个版本的命令是:
git reset --hard HEAD^
回退到上一个版本
此时 git log
已经不会展示之前的被抛弃的版本,如果上面的命令行没有关闭的话可以获得append GPL
的commit id
,此时用git reset
也可以还原:
git reset --hard 7cc923c7c82f59baef45b
还原到指定commit id
指定的版本,id
不需要全写
但是如果,命令行已经关闭,找不到commit id
,此时使用 git reflog
命令可以查看:
git reflog
记录每一次命令
$ git reflog
f620929 (HEAD -> master) HEAD@{0}: reset: moving to head^
7cc923c HEAD@{1}: reset: moving to 7cc923c7c82f59baef45bad87a7fe92372141f31
f620929 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
f620929 (HEAD -> master) HEAD@{3}: reset: moving to HEAD^
7cc923c HEAD@{4}: commit: add GPL # 找到这行,前面就是 commit id
f620929 (HEAD -> master) HEAD@{5}: commit: add distributed
b09dc7d HEAD@{6}: commit (initial): wrote a readme file
# 使用上面获得的id,就可以恢复到指定的版本
$ git reset --hard 7cc923c
HEAD is now at 7cc923c add GPL
删除文件
1.真的要删除 --> git rm filename
--> git commit -m 'del file'
2.误删,需要恢复文件 --> git checkout -- filename
(用版本库的版本替换工作区的版本)
# 删除文件
$ rm test.txt
# 查看状态
$ 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 add test.txt # 或者 git rm test.txt
# 查看状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: test.txt
# 提交删除操作到版本库
$ git commit -m 'del test.txt'
[master 69c78ac] del test.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 test.txt
撤销更改
丢弃工作区的修改
git checkout -- readme.txt
: 丢弃工作区的修改
- 还没有执行add,那么工作区将回到暂存区的状态
- 执行了add,还没有执行commit, 那么也将和暂存区一致
git reset HEAD <file>
: 可以把暂存区的修改撤销掉(unstage),重新放回工作区
远程仓库
ssh-keygen -t rsa -C "twilight0402@163.com"
: 创建RSA密钥对git remote add origin git@github.com:1601436878/AAA.git
: 关联远程仓库git remote rm origin
: 解除与远程版本库的关联git remote -v
: 查看git对应的远程仓库地址git push -u origin master
: 第一次提交到远程git push origin master
: 之后提交不需要-u
git clone git@github.com:1601436878/AAA.git
: 克隆仓库,克隆后,保留了完整的git仓库,包括git log
如果远程仓库有readme,回出错,第一次导入需要先pull
- git pull --rebase origin master
分支
git branch
: 查看分支git branch "name"
: 创建分支git checkout "name"
: 切换分支git checkout -b "name"
: 创建+切换分支git merge "name"
: 合并某分支到当前分支git branch -d "name"
: 删除分支- 将远程分支拉取到本地(sourcetree中只需要双击远程分支即可):
git fetch origin 远程分支名:本地分支名
: 将远程分支拉取到本地git checkout -b 本体分支 origin/远程分支
: 拉取远程分支,并切换到新分支
git branch dev
创建dev分支,dev指向是指针,指向当前版本。master也是指针,指向master分支上的最新的位置,HEAD指向master或者dev
git branch dev # 从master分支的当前位置,创建dev分区
git branch dev2 # 同理
在不同的分支下修改文件,并分别提交
git checkout dev
vim README.md
git checkout dev2
vim README.md
现在各个分支之间是这样的结构:
在不同的分支中,看不到其他分支的提交。但是git reflog
可以看到所有分支的所有变化。没有被add或commit的变化在所有分支都是可见的。
在master分支中执行 git merge dev
合并后,head
和master
都指向了dev。这时可以删除dev了。
但是此时无法删除dev2.如果执行git branch -d dev2
会报错,此时可以用git branch -D dev2
强行删掉dev2。如果想恢复到dev2的状态,就只能用 git reflog
找到之前的 commit id
了。
冲突
如果出现了一下这种情况,在合并分支时就会出现冲突
$ git merge feature
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
冲突后readme.md文件变成了这样:
$ cat README.md
git is a distributed version control system.
git is a free software under GPL.
git has a mutable index called stage.
<<<<<<< HEAD
Creating a new branch is quick AND Simple.
=======
Creating a branch is quick & Simple.
>>>>>>> dev
此时需要手动修改readme.me文件,然后再 add 和 commit, 这样冲突才会解决
$ cat README.md
git is a distributed version control system.
git is a free software under GPL.
git has a mutable index called stage.
Creating a new branch is quick and Simple.
git log --graph
可以查看分支合并的情况
$ git log --graph
* commit a40de601e061a393fae40df28796d9db4387bc27 (HEAD -> master)
| Merge: d6314aa 8dbf53c
| | Author: wangchao <twilight@0402.com>
| | Date: Thu Aug 8 15:21:12 2019 +0800
| |
| | fix confict
| |
| * commit 8dbf53c2d89e026544cc82be87ea21f593782ef8 (dev)
| | Author: wangchao <twilight@0402.com>
| | Date: Thu Aug 8 15:07:13 2019 +0800
| |
| | & Simple
| |
* | commit d6314aa206fcae0f103015933fe8027da2e763fb
|/ Author: wangchao <twilight@0402.com>
| Date: Thu Aug 8 15:04:19 2019 +0800
|
| AND Simple
|
* commit 499304186d8522d0beb2ed328ead76631bf81a2f
| Author: wangchao <twilight@0402.com>
| Date: Thu Aug 8 11:12:24 2019 +0800
$ git log --graph --pretty=oneline --abbrev-commit
* a40de60 (HEAD -> master) fix confict
|
| * 8dbf53c (dev) & Simple
* | d6314aa AND Simple
|/
* 4993041 edit in dev2
* f8e17ea (origin/master) del readme.txt
* 94571cf prepare
* 2adf4b6 del test.txt
* ee7d4b3 test.txt
* 52cc68c understand how stage works
* 16d5749 add GPL
* ff98a79 add distributed
* c435423 wrote a readme file
* 1891025 Initial commit
切换仓库
// 先删除关联
git remote rm origin
// 再关联新的地址
git remote add origin xxx
.gitignore
- 空行或是以#开头的行即注释行将被忽略;
- 以斜杠 “/” 结尾表示目录;
- 以星号 “*” 通配多个字符;
- 以问号 “?” 通配单个字符
- 以方括号 “[]” 包含单个字符的匹配列表;
- 以叹号 “!” 表示不忽略(跟踪)匹配到的文件或目录;
- 最前面加上
/
表示在当前目录下,不加则表示在所有目录下。比如data/
,所有子目录下的data
都会被忽略。
坑
git的.gitignore
文件必须在项目push之前就创建。如果已经push过了再创建.gitignore
就不会生效。
但是!有解决办法!==> 清空本地缓存,再提交就可以生效 git rm -r --cached .
。每次修改完.gitignore
文件后也需要再次清理一次缓存。
另,win下无法创建空文件名的文件,只能用gitBash的touch命令了
小结
git status
: 查看哪些被修改,是否被提交git diff <filename>
: 查看修改了什么内容,工作区和暂存区git diff HEAD -- readme.txt
: 查看工作区和版本库的区别git log [--pretty=oneline]
: 看到最近的commit
记录 [一行显示简化结果]git reflog
: 记录每一次状态变化的命令,可以查看到每一次变化的commit id
从版本库恢复到工作区
git reset --hard HEAD^
: 回退到上一个版本git reset --hard 7cc923c7c82f59baef45b
: 还原到指定commit id
指定的版本,id
不需要全写
删除文件:
1.真的要删除 --> git rm filename
--> git commit -m 'del file'
2.误删,需要恢复文件 --> git checkout -- filename
(用版本库的版本替换工作区的版本)