1、Ubuntu 安装
: $ sudo apt-get install git
2、版本创建:$ git init
3、添加文件filename
至版本库:
$ git add filename
$ git commit -m "提交说明"
可使用`git add`命令添加多个文件,然后使用`git commit`命令一次提交。
4、查看提交日志git log
和git log --pretty=oneline
hill@hill-virtual-machine:~/book/crawler/crawler$ git log
commit e2869168a5afc7c5dba4bc6bd72218ce74a8a153
Author: Arion <yngbhu@gmail.com>
Date: Mon Jan 29 18:52:33 2018 +0800
remove GPL
commit e80d3cde422fb3ec329a66012e42d3c5a18e149a
Author: Arion <yngbhu@gmail.com>
Date: Mon Jan 29 18:50:54 2018 +0800
a readme file
commit 410170ad4c717761a14fc76eeef0eef0c1755b43
Author: Arion <yngbhu@gmail.com>
Date: Mon Jan 29 18:45:58 2018 +0800
crawler download
hill@hill-virtual-machine:~/book/crawler/crawler$ git log --pretty=oneline
e2869168a5afc7c5dba4bc6bd72218ce74a8a153 remove GPL
e80d3cde422fb3ec329a66012e42d3c5a18e149a a readme file
410170ad4c717761a14fc76eeef0eef0c1755b43 crawler download
5、版本回退
在Git
中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
回退到上一个版本:$ git reset --hard HEAD^
回退到指定版本:$ git reset --hard 指定版本号(版本号不必写全,七位即可)
使用git reflog 查看全部历史命令
hill@hill-virtual-machine:~/book/crawler/crawler$ git reflog
e80d3cd HEAD@{0}: reset: moving to e80d3cd
410170a HEAD@{1}: reset: moving to HEAD^
e80d3cd HEAD@{2}: reset: moving to HEAD^
e286916 HEAD@{3}: commit: remove GPL
e80d3cd HEAD@{4}: commit: a readme file
410170a HEAD@{5}: commit (initial): crawler download
使用git reset可以回到任意历史状态
hill@hill-virtual-machine:~/book/crawler/crawler$ git reset --hard e80d3cd
HEAD is now at e80d3cd a readme file
6、暂存区(stage)
# 查看当前状态
$ git status
# 添加file1、file2至暂存区
$ git add file1
$ git add file2
# 查看当前状态
$ git status
# 将暂存区所有修改提交至分支
$ git commit -m "提交说明"
7、撤销修改
# 撤销工作区的修改
$ git checkout -- filename
# 撤销暂存区的修改
$ git reset HEAD filename
8、删除文件
$ git rm filename
$ git commit -m "remove filename"
9、添加远程仓库
# 添加远程仓库git remote add origin git@server-name:path/repo-name.git
git remote add origin git@github.com:ArionHill/wcwp.git
# 关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
# 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,
# Git不但会把本地的master分支内容推送的远程新的master分支,
# 还会把本地的master分支和远程的master分支关联起来,
# 在以后的推送或者拉取时就可以简化命令。
$ git push -u origin master
# 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
$ git push origin master
异常:
如果输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.
解决办法如下:
1、先输入$ git remote rm origin
2、再输入$ git remote add origin git@github.com:djqiang/gitdemo.git 就不会报错了!
10、从远程库克隆
git clone git@github.com:ArionHill/gitskills.git
11、分支创建与合并
# 创建dev分支
$ git branch dev
# 切换到dev分支
$ git checkout dev
# 上述两条命令可以用一条实现
$ git checkout -b dev
# 将dev分支合并到master分支
$ git checkout master # 将当前分支切换为master
$ git merge dev # 将dev分支合并到当前分支
$ git branch -d dev # 删除dev分支
# 查看branch
$ git branch
12、查看分支图:
$ git log --graph
$ git log --graph --pretty=oneline
$ git log --graph --pretty=oneline --abbrev-commit
查看分支图: --graph
单行显示:--pretty=oneline
版本号简写:--abbrev-commit
13、合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并
$ git merge --no-ff -m "提交说明" branchname
14、
# 保存当前工作状态
$ git stash
# 切换到要修该的分支,创建新分支进行相应工作
# 新分支合并到要修改分支,完成修改
# 切换到保存工作状态的分支
# 查看保存的工作状态
$ git stash list
# 恢复工作状态
$ git stash apply
# 删除保存的工作状态
$ git stash drop
# 恢复指定的工作状态
$ git stash list
stash@{0}: WIP on master: 0c51eb2 merge with no-ff
$ git stash apply stash@{0}
# 回复并删除保存的工作状态
$ git stash pop
15、强行删除未合并的分支
git branch -D <name>
16、比较不同版本文件差异
# 查看尚未暂存的文件更新了哪些部分
git diff
# 查看尚未暂存的某个文件更新了哪些
git diff filename
# 查看已经暂存起来的文件和上次提交的版本之间的差异
git diff –cached
# 查看已经暂存起来的某个文件和上次提交的版本之间的差异
git diff –cached filename
# 查看某两个版本之间的差异
git diff d617d8 7743fb
# 查看某两个版本的某个文件之间的差异
git diff d617d8:filename 7743fb:filename
17、多人协作
# 查看远程库信息
$ git remote
origin
$ git remote -v
origin git@github.com:ArionHill/wcwp.git (fetch)
origin git@github.com:ArionHill/wcwp.git (push)
# 推送分支
# 推送本地分支master
$ git push origin master
# 推送本地分支dev
$ git push origin master
# 多人协作
# 克隆到本地
$ git clone git@github.com:ArionHill/wcwp.git
# 查看本地分支
$ git branch
* master
# 创建远程origin的dev分支到本地
$ git checkout -b dev origin/dev
fatal: Cannot update paths and switch to branch 'dev' at the same time.
Did you intend to checkout 'origin/dev' which can not be resolved as commit?
# 处理异常
$ git checkout -b dev # 创建新的本地分支
$ git reset -- hard origin/dev # 设置它的起始点
$ git push -u origin dev # 推送到远程仓库
$ git remote show origin
* remote origin
Fetch URL: git@github.com:ArionHill/wcwp.git
Push URL: git@github.com:ArionHill/wcwp.git
HEAD branch: master
Remote branches:
dev tracked
master tracked
Local branches configured for 'git pull':
dev merges with remote dev
master merges with remote master
Local refs configured for 'git push':
dev pushes to dev (up to date)
master pushes to master (up to date)
# 更新远程仓库分支,设工作中dev分支中
$ git add <filename>
$ git commit -m <"提交说明">
$ git push origin dev
# 2号开发者提交
$ git push origin dev
To git@github.com:ArionHill/wcwp.git
! [rejected] dev -> dev (fetch first)
error: failed to push some refs to 'git@github.com:ArionHill/wcwp.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
# 根据提示整合本地与远程仓库
$ git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 2), reused 5 (delta 1), pack-reused 0
Unpacking objects: 100% (6/6), done.
From github.com:ArionHill/wcwp
* [new branch] dev -> origin/dev
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
# 根据提示设置dev和origin/dev的链接
$ git branch --set-upstream-to=origin/dev dev
Branch dev set up to track remote branch dev from origin.
$ git pull
Auto-merging hello.py
CONFLICT (add/add): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
# 查看冲突
$ cat hello.py
<<<<<<< HEAD
coding:utf-8
=======
/usr/bin/env
>>>>>>> 8ab6b5a1ff8e836e18961ec95ee558677a2d454b
# 修改后重新提交
$ git add hello.py
$ git commit -m "merge & fix hello.py"
[dev 14bf827] merge & fix hello.py
$ git push origin dev
Counting objects: 19, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (19/19), 1.58 KiB | 0 bytes/s, done.
Total 19 (delta 11), reused 0 (delta 0)
remote: Resolving deltas: 100% (11/11), completed with 3 local objects.
To git@github.com:ArionHill/wcwp.git
8ab6b5a..14bf827 dev -> dev
18、创建标签
# 创建标签 git tag <name>, 默认打在最新提交的commit上。
$ git tag v1.0
查看所有标签
$ git tag
v1.0
# 给指定commit大标签
# 查看commit id
$ git log --pretty=oneline --abbrev-commit
0c51eb2 merge with no-ff
0f9b1d4 add merge
8ea43bb conflict fixed
f3bc6f7 & simple
46dada4 and simple
9e991dd branch test
6e0b70b crawler init
055df59 first commit
a6e401d add test.txt
0f23f2a how stage works?
e80d3cd a readme file
410170a crawler download
# 给0f9b1d4 add merge打标签
$ git tag v0.9 0f9b1d4
# 查看标签v1.0
$ git show v1.0
commit 0c51eb2b0d6fadc4f1c675ed1e67efd194358f7e
Merge: 8ea43bb 0f9b1d4
Author: Arion <yngbhu@gmail.com>
Date: Tue Jan 30 09:30:53 2018 +0800
merge with no-ff
# 查看标签v0.9
$ git show v0.9
commit 0f9b1d4f2aa4c7b3943d5cc62556a5abd984dc68
Author: Arion <yngbhu@gmail.com>
Date: Tue Jan 30 09:29:46 2018 +0800
add merge
diff --git a/readme.txt b/readme.txt
index a697405..dfcb7a1 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2,3 +2,4 @@ Git is a distributed version control system.
Git is free software distributed under the GPL.
git has a mutable index called stage.
Creating a new branch is quick and simple.
+branch manage.
# 创建带有说明的标签,-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" e80d3cd
$ git show v0.1
tag v0.1
Tagger: Arion <yngbhu@gmail.com>
Date: Tue Jan 30 14:09:12 2018 +0800
version 0.1 released
commit e80d3cde422fb3ec329a66012e42d3c5a18e149a
Author: Arion <yngbhu@gmail.com>
Date: Mon Jan 29 18:50:54 2018 +0800
a readme file
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..8443d23
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,2 @@
+Git is a distributed version control system.
+Git is free software distributed under the GPL.
# 通过-s用私钥签名一个标签,因gpg问题报错
$ git tag -s v0.2 -m "signed version 0.2 released" 0f23f2a
gpg: keyring `/home/hill/.gnupg/secring.gpg' created
gpg: keyring `/home/hill/.gnupg/pubring.gpg' created
gpg: skipped "Arion <yngbhu@gmail.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
# 删除标签
$ git tag -d v0.1
Deleted tag 'v0.1' (was 314e51d)
# 推送标签到远程
$ git push origin v1.0
Counting objects: 1, done.
Writing objects: 100% (1/1), 213 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:ArionHill/wcwp.git
* [new tag] v1.0 -> v1.0
# 一次性推送全部尚未推送的到远程的本地标签
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:ArionHill/wcwp.git
* [new tag] v0.9 -> v0.9