Git/GitHub技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheidou123/article/details/60342968

一、基础相关

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 把分支线合成一条了~






猜你喜欢

转载自blog.csdn.net/cheidou123/article/details/60342968
今日推荐