git使用总结

github的应用很广泛,已经成为一个程序员必备的一项技能。不会git管理,基本上不是一个合格的程序员。本文对此作下总结,方便后续查阅

git使用

本文的重点不在此处,这里读者可参考廖雪峰老师的博文Git教程。里面对git的原理以及安装使用分析的很到位,并且结合了很多实例用于讲解,是很优秀的文章集锦,此处博主深度安利下。博主只记录下本身遇到的有用的命令供以后查阅

git merge 和 git rebase

都是可以用来合并代码文件的命令。两者合并的概念有所不同。
1.调用方式
git merge

#先切换至被合并的分支
$ git checkout master

#执行merge命令,让v1来合并当前分支
$ git merge v1

git rebase

#即合并v1分支到master分支,且会自动切换至master分支
$ git rebase v1 master

#也可采取这种方式
$ git checkout master 
$ git rebase v1

2.合并步骤
git merge命令其会比较两个branch的commit节点,然后进行合并,如果有冲突则会产生新的commit节点;
git rebase <upstream-branch-name> <to-branch-name>命令则会执行以下逻辑

1.切换到to-branch分支;

2.将to-branch中比upstream-branch多的commit先撤销掉,并将这些commit放在一块临时存储区(.git/rebase);

3.将upstream-branch中比to-branch多的commit应用到to-branch上,此刻to-branch和upstream-branch的代码状态一致;

4.将存放的临时存储区的commit重新应用到to-branch上;

5.结束。

        执行完上述第3步后,to-branch的代码状态已经改变,接着执行第4步时则可能会产生合并冲突。

Tips:

  1. git rebase操作即使在产生冲突的时候也不会重新产生新的commit id,而git merge在绝大部分情况下则会产生新的commit id(除非待合并的分支与当前分支是包含关系而不是交叉关系)

  2. git rebase在解决完冲突后,需要执行git rebase --continue才算合并结束。合并后两个branch的commit记录都会保存下来。另外这里也罗列下其他的两个命令方法

    #放弃挂起的patch提交记录,也就是直接应用源branch的提交记录,舍弃本身的提交记录
    $ git rebase --skip
    
    #即撤销rebase操作
    $ git rebase --abort
    
  3. git merge默认情况下是使用fast forward方式合并的,其会忽略合并信息,加上--no-ff -m "commit merge"参数则会记录合并操作

git branch 和 git checkout

都是可以用于创建分支的命令。但git checkout的功能比git branch强大,下述以创建分支v1为例
1.分支创建

#切换分支到master
$ git checkout master
#创建分支v1,但是不会自动切换上下文至v1分支,此处仍为master分支
$ git branch v1

-------------------------------
-------------------------------

#根据当前分支创建v1分支并且切换上下文至v1
$ git checkout -b v1

2.分支与远程关联
如果创建的分支想关联远程仓库的分支,此处假设远程服务器已创建分支v1,则可以使用以下命令

#创建分支v1,并关联远程的v1仓库
$ git checkout -b v1 origin/v1

上述操作主要是方便本地v1分支的修改推送到远程上能自动映射,如果使用git branch,则需要进行关联操作才可以git push

$ git branch --set-upstream v1 origin/v1

3.分支删除

#删除v1分支
$ git branch -d v1

#强制删除v1分支
$ git branch -D v1

4.分支查看

#查看本地分支(带*即为当前分支)
$ git branch
	feature1
	master
*	v1

#查看远程分支
$ git branch -r
	origin/HEAD --> origin/master
	origin/master
	origin/v1

#查看远本地分支的具体信息
$ git branch -v

5.文件操作

git checkout -- <file>还可用于还原指定文件到最近的一次git add或者git commit对应的记录

Tips:分支的创建、删除、合并在git的本地操作是非常快的,所以git很推荐使用分支来处理代码的编写、合并。

git clone 和 git fetch/git pull

三者命令都可以用来下载远程仓库代码。三者调用方式如下

#两种方式下载远程代码,ssh方式和https方式
$ git clone git@github.com:jtjsir/GitTest

$ git clone https://github.com/jtjsir/GitTest.git

#git pull 下载方式
$ mkdir GitTest
$ git init
$ git remote add origin https://github.com/jtjsir/GitTest.git
$ git pull origin master
#如果当前分支为master,则下述调用方式同上
$ git pull

#以下方式并不能下载文件
$ git fetch origin master
  1. git pull包含了git fetchgit merge

  2. git fetch其会拿取远程库的最新commit id与本地分支指向远程库的commit id进行对比(.git/refs/remote/origin/{branch}),如果不一致,则设置为最新的commit id。而git pull操作在git fetch的基础上进行判断,如果commit id不一致,则会调用git merge拉取线上最新的代码合并至本地

  3. 一般建议使用git clone来初次下载仓库,后续操作采用git pull命令更新仓库

git push

推送本地仓库到远程仓库。语法如下
git push <remote> <localRepo>:<remoteRepo>。这里罗列下其用途

#上传本地master分支到远程origin的master分支
$ git push origin master

#创建远程分支v1(v1分支在远程服务器尚未存在),执行下述命令刷新github服务器即有v1分支
$ git push origin v1:v1

#删除远程分支v1
$ git push origin :v1

git log

用于查看当前分支的提交情况,常用用法有

#列表形式,所列信息较详细
$ git log
commit 03fde2c26e391c5b7732677abf763cc9104251c2
Merge: 2f19739 e06bb86
Author: jtjsir <**@163.com>
Date:   Fri Mar 2 14:55:26 2018 +0800

    fix conflict

commit 2f1973967ca0559ebbe3772b2c735e7e39304818
Author: jtjsir <**@163.com>
Date:   Fri Mar 2 14:52:52 2018 +0800

    fix syntax -by master

commit e06bb8683f2ea69a9fac825c5ccc732c34370f82
Author: jtjsir <**@163.com>
Date:   Fri Mar 2 14:48:20 2018 +0800

    fix syntax error -by branch_feature1

commit d0f6c095b99416db7c4a9f45c47e467fd7abaa9d
Author: jtjsir <**@163.com>
Date:   Fri Mar 2 11:11:29 2018 +0800

    add comment for java. -by branch_v1
  ...

#简便列表展示
$ git log --pretty=oneline
03fde2c26e391c5b7732677abf763cc9104251c2 fix conflict
2f1973967ca0559ebbe3772b2c735e7e39304818 fix syntax -by master
e06bb8683f2ea69a9fac825c5ccc732c34370f82 fix syntax error -by branch_feature1
d0f6c095b99416db7c4a9f45c47e467fd7abaa9d add comment for java. -by branch_v1
55f4ebf23d3ec8214c5caf83c13b23441ccf24e8 add php codes
7cfa63ed7da74212cd3532a5e4032af08af9ff90 add java codes
2dcf842671698a0be0ff41f7d1838195201ecfe2 Initial commit

#同上
$ git log --oneline
03fde2c fix conflict
2f19739 fix syntax -by master
e06bb86 fix syntax error -by branch_feature1
d0f6c09 add comment for java. -by branch_v1
55f4ebf add php codes
7cfa63e add java codes
2dcf842 Initial commit

#图形化展示
$ git log --graph --oneline --abbrev-commit
*   419deae fixed the merge by v1
|  
| * d83903d add comment by v2
* | 2615020 modify by v1
|/  
* 43aabae add comment by v1
*   03fde2c fix conflict
|  
| * e06bb86 fix syntax error -by branch_feature1
* | 2f19739 fix syntax -by master
|/  
* d0f6c09 add comment for java. -by branch_v1
* 55f4ebf add php codes
* 7cfa63e add java codes
* 2dcf842 Initial commit

git stash

缓存当前的工作区间状态。常用于突发情况下的bug修复,缓存当前工作区间方便以后继续解决

#缓存当前分支状态
$ git stash

#查看当前分支状态列表
$ git stash list

#恢复最新的分支状态并在list集合中删除
$ git stash pop

#恢复当前分支的指定状态
$ git stash apply stash@{0}

git reset

回滚提交操作,常用命令如下

#回滚到上一个提交
$ git reset --hard HEAD^

#回滚到上两个版本的提交
$ git reset --hard HEAD^^

#回滚到上50个版本的提交
$ git reset --hard HEAD~50

#回滚到指定的版本,根据commit id
$ git reset --hard <commit id>

#回滚某个文件[add操作后commit操作前]
$ git reset HEAD <file>

git diff

git在本地有个这样的逻辑:

#工作区-->暂存区(add操作后存放)-->本地git版本库(commit操作后存放)
working directory --> stage area(.git/index文件)--> git repository(.git/refs目录)

比较版本之间的差异或者文件。常用方式如下

#拿工作区和暂存区比较差异
$ git diff

#拿工作区的整体或者某文件与上一版本比较差异
$ git diff HEAD^ <pathfile>

#拿工作区与指定版本比较差异
$ git diff <commit-id> <pathfile>

#拿暂存区与指定版本比较差异
$ git diff --cached <commit-id>

#比较两个指定版本的差异
$ git diff <commit-id> <commit-id>

总结

好记性不如烂笔头

原文地址:https://www.cnblogs.com/question-sky/p/8494444.html