一、基础相关
1.创建版本库
caibindeMacBook-Pro:testgit caibin$ git init
Initialized empty Git repository in /Users/caibin/testgit/.git/
我们可以看到在testgit文件下多了一个.git文件
2.工作区和暂存区
⑴我们在电脑里能看到的就是工作区,就像我上面的testgit
⑵工作区里面有个.git文件,这个是.git的版本库,版本库里还有一个很重要的部分就是stage(暂存区)
我们往Git版本库添加文件的时候,分为两步:
①git add 把文件添加到暂存区
②git commit 把暂存区的所有内容提交到当前分支(我们创建Git版本库时,Git自动为我们创建了master分支)
caibindeMacBook-Pro:gitlearn caibin$ git add test.txt
caibindeMacBook-Pro:gitlearn caibin$ git commit -m "do1"
[master (root-commit) a4e67f7] do1
1 file changed, 1 insertion(+)
create mode 100644 test.txt
3.查看工作区和版本库的区别
git diff 目标文件 :可以查看工作区和最新提交的不同
caibindeMacBook-Pro:gitlearn caibin$ git diff HEAD -- test.txt
diff --git a/test.txt b/test.txt
index 5bdcfc1..df7af2c 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-version1
+version2
4.版本回退(危险系数高)
⑴我们修改为version2后commit,用git log查看一下我们git的日志
caibindeMacBook-Pro:gitlearn caibin$ git log
commit 500950ffb69564b9f7b4e752c3b1884b975d0fc4 (HEAD -> master)
Author: bincai <[email protected]>
Date: Sat Jun 30 17:09:58 2018 +0800
do2
commit a4e67f7d6ce171672bd9ad2a4cd615736e7780d7
Author: bincai <[email protected]>
Date: Sat Jun 30 17:06:43 2018 +0800
do1
⑵回退
git reset --hard 版本号
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt
version2
caibindeMacBook-Pro:gitlearn caibin$ git reset --hard a4e6
HEAD is now at a4e67f7 do1
caibindeMacBook-Pro:gitlearn caibin$ git log
commit a4e67f7d6ce171672bd9ad2a4cd615736e7780d7 (HEAD -> master)
Author: bincai <[email protected]>
Date: Sat Jun 30 17:06:43 2018 +0800
do1
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt
version1
⑶如果后悔了怎么办?
git reflog命令可以解决
caibindeMacBook-Pro:gitlearn caibin$ git reflog //找到以前的提交id
a4e67f7 (HEAD -> master) HEAD@{0}: reset: moving to a4e6
500950f HEAD@{1}: commit: do2
a4e67f7 (HEAD -> master) HEAD@{2}: commit (initial): do1
caibindeMacBook-Pro:gitlearn caibin$ git reset --hard 5009 //回退
HEAD is now at 500950f do2
caibindeMacBook-Pro:gitlearn caibin$ git log
commit 500950ffb69564b9f7b4e752c3b1884b975d0fc4 (HEAD -> master)
Author: bincai <[email protected]>
Date: Sat Jun 30 17:09:58 2018 +0800
do2
commit a4e67f7d6ce171672bd9ad2a4cd615736e7780d7
Author: bincai <[email protected]>
Date: Sat Jun 30 17:06:43 2018 +0800
do1
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt
version2
5.撤销提交
git revert,和reset相比,它是生成新的提交来撤销。
⑴修改text并提交
我们先看一下分支上文件的内容
caibindeMBP:gitlearn caibin$ cat test.txt
beforerevert
修改text并提交
caibindeMBP:gitlearn caibin$ vim test.txt
caibindeMBP:gitlearn caibin$ git add test.txt
caibindeMBP:gitlearn caibin$ git commit -m "tijiao"
[dev 4a663a6] tijiao
1 file changed, 1 insertion(+), 1 deletion(-)
⑵回滚
caibindeMBP:gitlearn caibin$ git log
commit 4a663a64c2452417dd401e398f87bbef53cdc80e (HEAD -> dev)
Author: bincai <[email protected]>
Date: Sun Jul 1 16:06:25 2018 +0800
tijiao
commit 41de8cf290a362152994cc2aad49a60fc511f748
Author: bincai <[email protected]>
Date: Sun Jul 1 16:02:50 2018 +0800
beforerevert
commit 6812afa280a7fdec205c817152eaf9e08837c461
Author: bincai <[email protected]>
Date: Sun Jul 1 15:58:30 2018 +0800
Revert "test"
This reverts commit 30ba3d5a15427120804d730a94021088aa4ce6f6.
commit 30ba3d5a15427120804d730a94021088aa4ce6f6
Author: bincai <[email protected]>
Date: Sun Jul 1 15:56:36 2018 +0800
caibindeMBP:gitlearn caibin$ git revert 4a66
[dev a531644] Revert "tijiao"
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMBP:gitlearn caibin$ git log
commit a5316449137ae8f825bbb8b99277506c4ce1cd01 (HEAD -> dev)
Author: bincai <[email protected]>
Date: Sun Jul 1 16:08:50 2018 +0800
Revert "tijiao"
This reverts commit 4a663a64c2452417dd401e398f87bbef53cdc80e.
commit 4a663a64c2452417dd401e398f87bbef53cdc80e
Author: bincai <[email protected]>
Date: Sun Jul 1 16:06:25 2018 +0800
tijiao
commit 41de8cf290a362152994cc2aad49a60fc511f748
Author: bincai <[email protected]>
Date: Sun Jul 1 16:02:50 2018 +0800
beforerevert
commit 6812afa280a7fdec205c817152eaf9e08837c461
Author: bincai <[email protected]>
Date: Sun Jul 1 15:58:30 2018 +0800
caibindeMBP:gitlearn caibin$ cat test.txt
beforerevert
6.撤销修改
git checkout -- file 可以撤销修改,即让这个文件回到最近一次git commit 或 git add的状态
⑴还未提交到暂存区
我们先把文件内容改成version3,然后从版本库checkout
caibindeMacBook-Pro:gitlearn caibin$ git checkout -- test.txt
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt
version2
⑵已经提交到暂存区了
如果我们先把文件改成version3,然后add到暂存区里面
然后改成把文件改成version4,再checkout
caibindeMacBook-Pro:gitlearn caibin$ git checkout -- test.txt
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt
version3
可见,它把暂存区的给搞下来了
7.删除文件
首先我们创建一个testrm.txt文件并提交上去。
caibindeMacBook-Pro:gitlearn caibin$ git rm testrm.txt //在本地删除
rm 'testrm.txt'
caibindeMacBook-Pro:gitlearn caibin$ git commit -m "rm" //提交
[master d8223f5] rm
1 file changed, 1 deletion(-)
delete mode 100644 testrm.txt
caibindeMacBook-Pro:gitlearn caibin$ git log //查看日志
commit d8223f51c26d67c6fd57ee5b2d64985a5667c019 (HEAD -> master)
Author: bincai <[email protected]>
Date: Sat Jun 30 18:48:27 2018 +0800
rm
commit ca84769896d991aa7ef6858b5676dd1c5afc75f1
Author: bincai <[email protected]>
Date: Sat Jun 30 18:45:25 2018 +0800
rmtest
commit 500950ffb69564b9f7b4e752c3b1884b975d0fc4
Author: bincai <[email protected]>
Date: Sat Jun 30 17:09:58 2018 +0800
do2
commit a4e67f7d6ce171672bd9ad2a4cd615736e7780d7
Author: bincai <[email protected]>
Date: Sat Jun 30 17:06:43 2018 +0800
do1
二、远程库相关
1.在gitHub上创建一个远程仓库并配置
caibindeMacBook-Pro:gitlearn caibin$ git remote add origin https://github.com/cGitHub123/gitlearn.git
2.向远程仓库推送
caibindeMacBook-Pro:gitlearn caibin$ git push -u origin master
Counting objects: 12, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (12/12), 843 bytes | 843.00 KiB/s, done.
Total 12 (delta 0), reused 0 (delta 0)
To https://github.com/cGitHub123/gitlearn.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
git push -u 里面-u是吧origin指定为默认主机,以后不改就不用加了
3.从远程库克隆
git clone命令可以从远程仓库克隆
4.fetch
更新远程代码到本地库
首先我们手动的将github master分支的test.txt内容改成wogai
⑴git fetch
caibindeMBP:gitlearn caibin$ git fetch
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
From https://github.com/cGitHub123/gitlearn
0304eda..9aa9039 master -> origin/master
caibindeMBP:gitlearn caibin$ git rebase
First, rewinding head to replay your work on top of it...
Applying: go
Using index info to reconstruct a base tree...
M test.txt
Falling back to patching base and 3-way merge...
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
error: Failed to merge in the changes.
Patch failed at 0001 go
The copy of the patch that failed is found in: .git/rebase-apply/patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
caibindeMBP:gitlearn caibin$ cat test.txt
<<<<<<< HEAD
wogai
=======
heidourebase
>>>>>>> go
5.pull
git pull :git fetch + git merge
git pull --rebase : git fetch +git rebase
三、分支管理
1.创建并切换分支
创建分支:git branch 分支名
切换分支:git checkout 分支名
或者直接创建并切换分支:
git checkout -b 分支名
caibindeMacBook-Pro:gitlearn caibin$ git checkout -b dev
Switched to a new branch 'dev'
2.合并分支
我们把文件修改一下再提交到dev分支
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt //在dev分支下查看test文件
version4
caibindeMacBook-Pro:gitlearn caibin$ git checkout master //切换到master分支
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt //查看master下test文件
version3
caibindeMacBook-Pro:gitlearn caibin$ git merge dev //合并dev分支到master
Updating d8223f5..3eff4c4
Fast-forward
test.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMacBook-Pro:gitlearn caibin$ cat test.txt //再次查看master文件
version4
3.删除分支
git branch -d 分支名
git branch -D 分支名 这个是强行删除
4.解决冲突
假设我们在master和dev分支同时修改并提交了test.txt文件。那么当我们合并时候就会报出:
caibindeMBP:gitlearn caibin$ git merge dev
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
然后我们查看test.txt文件
caibindeMBP:gitlearn caibin$ cat test.txt
<<<<<<< HEAD
version4master
=======
version4dev
>>>>>>> dev
可以看到确实存在冲突,修改后再提交就行了
5.禁用fast-forward模式
如果我们采用fast-forward模式,当我们删除dev分支后,会丢掉分支信息,我们可以禁用fast-forward模式
首先我们把分支重置为:
caibindeMBP:gitlearn caibin$ git log --graph --pretty=oneline --abbrev-commit
* 3eff4c4 (HEAD -> master) bracnch
* d8223f5 (origin/master) rm
* ca84769 rmtest
* 500950f do2
* a4e67f7 do1
然后新建dev
caibindeMBP:gitlearn caibin$ git checkout -b dev
Switched to a new branch 'dev'
caibindeMBP:gitlearn caibin$ vim test.txt
caibindeMBP:gitlearn caibin$ git add test.txt
caibindeMBP:gitlearn caibin$ git commit -m "dev"
[dev 52c7aa4] dev
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMBP:gitlearn caibin$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
caibindeMBP:gitlearn caibin$ git merge dev //这里开启了fast-forward模式
Updating 3eff4c4..52c7aa4
Fast-forward
test.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMBP:gitlearn caibin$ git branch -d dev
Deleted branch dev (was 52c7aa4).
caibindeMBP:gitlearn caibin$ git log --graph --pretty=oneline --abbrev-commit
* 52c7aa4 (HEAD -> master) dev
* 3eff4c4 bracnch
* d8223f5 (origin/master) rm
* ca84769 rmtest
* 500950f do2
* a4e67f7 do1
新建dev1
caibindeMBP:gitlearn caibin$ git checkout -b dev1
Switched to a new branch 'dev1'
caibindeMBP:gitlearn caibin$ vi test.txt
caibindeMBP:gitlearn caibin$ git add test.txt
caibindeMBP:gitlearn caibin$ git commit -m "dev1"
[dev1 ea06110] dev1
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMBP:gitlearn caibin$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
caibindeMBP:gitlearn caibin$ git merge --no-ff -m "merge" dev1 //关闭fast-forward模式
Merge made by the 'recursive' strategy.
test.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMBP:gitlearn caibin$ git log --graph --pretty=oneline --abbrev-commit
* 0e1bd50 (HEAD -> master) merge
|\
| * ea06110 (dev1) dev1
|/
* 52c7aa4 dev
* 3eff4c4 bracnch
* d8223f5 (origin/master) rm
* ca84769 rmtest
* 500950f do2
* a4e67f7 do1
caibindeMBP:gitlearn caibin$ git branch -d dev1
Deleted branch dev1 (was ea06110).
caibindeMBP:gitlearn caibin$ git log --graph --pretty=oneline --abbrev-commit
* 0e1bd50 (HEAD -> master) merge
|\
| * ea06110 dev1
|/
* 52c7aa4 dev
* 3eff4c4 bracnch
* d8223f5 (origin/master) rm
* ca84769 rmtest
* 500950f do2
* a4e67f7 do1
6.bug分支
如果我们在dev分支开发过程中需要临时修改master分支的bug,我们可以将dev分支先stash,然后取master分支切新分支改bug,之后再切回dev分支从stash恢复。
先暂存
caibindeMBP:gitlearn caibin$ git branch
* dev
master
caibindeMBP:gitlearn caibin$ cat test.txt
version4stash
caibindeMBP:gitlearn caibin$ git stash //先暂存
Saved working directory and index state WIP on dev: 0e1bd50 merge
改完master分支,再切回来
caibindeMBP:gitlearn caibin$ git checkout dev
Switched to branch 'dev'
caibindeMBP:gitlearn caibin$ cat test.txt
version4dev1
caibindeMBP:gitlearn caibin$ git stash list //重点
stash@{0}: WIP on dev: 0e1bd50 merge
caibindeMBP:gitlearn caibin$ git stash pop stash@{0} //重点
On branch dev
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: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
.test.txt.swp
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (3494cc28270cf2672673b88838bb8bb75ef4a8ac)
caibindeMBP:gitlearn caibin$ cat test.txt
version4stash
这里我们有两种方式来找回
⑴git stash apply 后面可以跟上编号,如上面的stash@{0}
git stash drop 删除stashlist
⑵git stash pop 找回并删除
7.多人协作
⑴首先用 git push origin 本地分支 来推送
⑵如果有冲突,git pull 拉取解决冲突,解决后重新提交。
8.rebase
rebase也是合并分支,它和merge的区别可以用图来展示
我们先创建一个testrebase分支
caibindeMBP:gitlearn caibin$ git branch testrebase
切到testrebase分支,并修改text.txt内容为heidourebase,然后我们切到主分支,但是这里会报错:
caibindeMBP:gitlearn caibin$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
test.txt
Please commit your changes or stash them before you switch branches.
Aborting
⑴暂存
caibindeMBP:gitlearn caibin$ git stash
切回去后,再
caibindeMBP:gitlearn caibin$ cat test.txt
versionrebase
caibindeMBP:gitlearn caibin$ git rebase testrebase
Current branch master is up to date.
caibindeMBP:gitlearn caibin$ cat test.txt
versionrebase
查看gitlog没有任何操作
⑵提交
先在master修改test.txt并且提交
caibindeMBP:gitlearn caibin$ vim test.txt
caibindeMBP:gitlearn caibin$ cat test.txt
masterrebase
caibindeMBP:gitlearn caibin$ git add test.txt
caibindeMBP:gitlearn caibin$ git commit test.txt
Aborting commit due to empty commit message.
caibindeMBP:gitlearn caibin$ git commit -m "master"
[detached HEAD ca4ba78] master
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 test.txg
caibindeMBP:gitlearn caibin$ cat test.txt
masterrebase
切回testrebase分支并改为testrebase并提交
caibindeMBP:gitlearn caibin$ vim test.txt
caibindeMBP:gitlearn caibin$ git add test.txt
caibindeMBP:gitlearn caibin$ git commit -m "test"
[testrebase 0030c93] test
1 file changed, 1 insertion(+), 1 deletion(-)
caibindeMBP:gitlearn caibin$ cat test.txt
testrebase
然后切回master分支,git rebase,这时候可能会有冲突了:
caibindeMBP:gitlearn caibin$ git add test.txt
caibindeMBP:gitlearn caibin$ git status
rebase in progress; onto 0030c93
You are currently rebasing branch 'master' on '0030c93'.
(all conflicts fixed: run "git rebase --continue")
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
.test.txt.swp
testrebase
caibindeMBP:gitlearn caibin$ git rebase --continue
Applying: masterrebase
caibindeMBP:gitlearn caibin$ cat test.txt
<<<<<<< HEAD
<<<<<<< HEAD
testrebase
=======
heidourebase
>>>>>>> tijiaole
=======
masterrebase
>>>>>>> masterrebase
我们查看分支情况:
* f83b454 (HEAD -> master) masterrebase
* f5a9b6a tijiaole
* 84f461e 123
* 0030c93 (testrebase) test
* 8b6ebda test
* 943be60 go
* 0e1bd50 merge
|\
| * ea06110 dev1
|/
* 52c7aa4 dev
相比于merge , rebase 把分支线合成一条了~