Git时间:常用Git命令收集整理(持续更新)

根据网络资源进行整理,记录的比较详细方便自己日后查看。以下列举的命令可以在项目目录打开GitBash使用,也可以在AndroidStudio或者IntelliJ等支持Git的IDE中使用。

《Git时间:常用Git命令收集整理(持续更新)》

基础概念Repositiry

在版本管理中,Repository翻译过来就是仓库的意思,每个提交到本地,或者PUSH到远程服务器的 Project,被 Github以数据结构的形式保存,而这个数据结构被称为 Repository 即仓库。

《Git时间:常用Git命令收集整理(持续更新)》

配置用户信息(config命令)

配置个人用户名和邮件地址,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新

$ git config --global user.name “youname”
$ git config --global user.email “12345@example.com”

如果用了 --global 选项,那么更改的配置文件位于你用户主目录下,以后所有项目都默认使用这里配置的用户信息。如果要在某个特定项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新设定保存在当前项目的 /.git/config 文件里。

命令输入的自动补全功能,输入命令后按tab键,就会看到列出所有匹配的可用命令建议:

$ git co<tab>

提交(commit)推送(push)与拉取(pull)

初始化一个本地仓库:

$ git init

初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件

$ git init –-bare   

初始化加上–bare参数后会建立一个以分享/分布式开发为目的的纯粹服务器仓储,而 git init 或者 git clone 都是建立(或拷贝)一个本地的开发工作目录。

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令对这些文件进行跟踪,然后提交:
跟踪文件:(将文件加到暂存区域)

$ git add <filename>

跟踪全部文件:

$ git add .

提交(commit)更新:通过commit命令提交至本地仓库中,每一次commit都意味着版本在进行一次更新。

$ git commit -m "commit-desc"

注意commit只是将修改提交到本地的仓库,并没有更新服务器。
如果觉得暂存区繁琐,$ git commit -a 命令会自动把所有已经跟踪的文件暂存起来一并提交,从而省略 git add 步骤。

移除文件:(remove),只能移除一个文件

$ git rm <filename>

如果需要移除 abc 目录下的所有文件,则可以用递归移除命令,加 -m 参数,如下:

$ git rm -m abc/*

重命名文件:(rename)

$ git mv oldname.txt newname.txt

推送(PUSH)数据到仓库:

$ git push [remote-name] [branch-name]

比如,将本地[master]分支推送(push)到Github服务器[origin]分支(说明下:克隆操作会自动使用默认的master 和origin 名字),可以运行下面的命令:

$ git push origin master

获取远程分支的最新版本(修改)到本地有两种方式:

$ git pull <remote-name>

从远程获取最新版本到地,并且会自动merge!

$ git fetch <remote-name>

从远程获取最新版本到地,不会自动merge,并且 $ git fetch 可得到远程代码仓库中本地没有的分支

添加与克隆远程仓库

把仓库从远程服务器克隆到本地:(三种方式)

$ git clone git://github.com/youname/project.git
$ git clone git@github.com:youname/project.git
$ git clone https://github.com/youname/project.git

这时可以使用 ls -al 命令查看目录文件列表,命令如下:

$ ls -al

/.git目录: 把仓库克隆到本地后在工作目录下会有一个默认隐藏的 .git目录,就是Git仓库。其中存放的是我们所提交的文档索引内容,Git基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内。

创建 [.gitignore] 文件:

$ touch .gitignore

/.gitignore文件用于配置git忽略文件规则。项目中有很多文件不必使用git管理,例如Eclipse或其他IDE生成的项目文件,编译生成的各种目标或临时文件等。使用git status时,会在Untracked files里面看到这些文件列表。在文件.gitignore中配置规则来告诉git把这些文件忽略。支持通配符,例如:

*.a           #忽略所有以.a为后缀的文件; 
!lib.a        #不忽略文件lib.a;  
/TODO         #只忽略此目录下TODO文件,子目录的TODO不被忽略; 
build/        #忽略build目录下的所有文件;  
doc/*.txt     #只忽略doc/下所有的txt文件,但是不忽略doc/subdir/下的txt文件   

对于已经加入到索引的应该忽略的文件,使用命令将要忽略的文件从索引中删除:

$ git rm --cached filename

或者

$ git update-index --force-remove foo.class

向远程服务器添加仓库:(远程仓库必须先在github上建好)

$ git remote add [shortname] [url]  

例如:$ git remote add origin git@github.com:youname/yourRepo.git

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库

远程仓库的删除:

$ git remote rm <repo-name>

远程仓库重命名,从 重命名为 :

$ git remote rename <from-name> <to-name>

状态(status)和日志(log)

查看配置信息:查看已有的配置信息

$ git config --list
$ git config -l

获取帮助:例如想获取config命令的帮助信息

$ git help config 
$ git config --help

检查当前文件状态:

$ git status

查看提交日志:(默认不使用任何参数,会按时间列出所有更新,最近的更新排在最上面)

$ git log

我们常用 -p 命令展开显示每次提交的内容差异,用 -2 命令则仅显示最近两次更新:

$ git log -p -2

另外 –stat 命令仅简要的显示文件增改行数统计,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计:

$ git log --stat

另外 –author 命令仅显示指定作者相关的提交:(查找 author 提交的版本)

$ git log  --author=author

查看HEAD信息

HEAD可以理解为一个指针,每次都指向当前分支的最后一次信息(commit或者pull),通过移动HEAD可以切换分支;如果当前分支在master,那么HEAD信息可以用下图表示:

《Git时间:常用Git命令收集整理(持续更新)》

查看当前的HEAD信息:

$ cat .git/HEAD

Diff命令:比较差异

显示工作目录与暂存区文件的差异(修改之后还没有暂存起来的变化内容),不加参数:

$ git diff
(show diff of unstaged changes.)

显示暂存区与上次提交的git仓库之间的差异:

$ git diff --cached
(show diff of staged changes. Git 1.6.1 及更高版本还允许使用 $ git diff --staged,效果是相同的).

比较工作区和上次提交之间所有的改动:

$ git diff HEAD
        $ git diff HEAD^  比较上次提交,HEAD^也就是HEAD~1
        $ git diff HEAD~2 比较上2次提交
(show diff of all staged or unstated changes.)

使用图形工具显示文件之间的差异:

git difftool

列出文件列表,显示差异:

git diff --stat

比如,获得两个版本间所有变更的文件列表:

git diff --name-status HEAD~2 HEAD~3

只对比给定的文件

git diff -- filename    

历史提交对比可用下列命令

比较当前工作目录与指定版本改动:

$ git diff <version-tag>      

跟log命令一样,diff也可以加上--stat参数来简化输出:

$ git diff <version-tag> --stat

比较两次提交版本(或者两个分支)的内容改动:

$ git diff <version-tag-1> <version-tag-2> 

等价于

$ git diff <version-tag-1>..<version-tag-2> 

如果省略任意一个<version-tag>,默认将使用HEAD代替。其中,<version-tag>可以是简写的commit哈希值,也可是是HEAD。其中HEAD代表最后一次提交,HEAD^代表最后一次提交的父提交,HEAD~1等价于HEAD^,HEAD~2为倒数第二次提交,以此类推。

GIT分支:可以很方便的创建新分支,在新分支上解决问题,完成测试后将新分支合并到master分支

《Git时间:常用Git命令收集整理(持续更新)》

查看当前分支:(当前分支默认为 master 分支)

$ git branch

查看本地和远程的所有分支:

$ git branch -a

查看各个分支最后一个提交对象的信息:

$ git branch -v

创建一个名为“testing”的新分支:

$ git branch <branch-name|testing>

切换到“testing”分支(创建完成后,当前所在分支为 master 分支,当前分支一般会有 * 标示):

$ git checkout testing

新建并切换到新分支(和以上两个命令的效果相同):

$ git checkout -b <branch-name>

这条命令相当于执行下面这两条命令:

$ git branch <new-branch>
$ git checkout <new-branch>

从A分支创建并切换到B分支,可以这样写(如果不写<branch-A>则默认从当前分支创建并切换到B分支):

$ git branch -b <branch-B> <branch-A>

删除hotfix分支:(如果该分支还未被合并则会提示错误,因为这样会丢失数据)

$ git branch -d hotfix

强制删除hotfix分支:(强制删除,不会提示错误)

$ git branch -D hotfix

推送本地分支到远程分支:

$ git push origin <local-branch>:<remote-branch>

其中,<local-branch>为本地分支,<remote-branch>为远程分支,若远程分支不存在则会自动创建;
类似,如果<local-branch>留空,效果则是删除远程<remote-branch>分支,命令如下:

git push origin :<remote-branch>

切换到远程分支:

$ git checkout remotes/origin/<branch-name>

合并分支

<branch>分支的代码合并到master分支:(需要先切换到master分支,再执行merge)

$ git checkout master
$ git merge <branch>

合并代码冲突:当合并代码时经常会出现冲突,也可能出现在从远程仓库pull仓库时。可先用 $ git status 检查冲突状态,解决问题(比如使用AndroidStudio的Compare试图进行对比分析)后再合并,比如:

<manifest>
    <application>
        android:label="demo"
<<<<<<< HEAD
        android:icon="@drawable/app_icon"
=======
        android:theme="@style/AppTheme"
>>>>>>> [remote-branch]
    </application>
</manifest>

注意:<<<<<<<=======中间的内容是当前用户工作目录的修改,而=======>>>>>>>中间内容是远程分支[remote-branch]别人提交的修改

查看已经与当前分支合并的分支:(已经合并的查出来后可以删掉)

$ git branch --merge

查看未与当前分支合并的分支:

$ git branch --no-merged

rebase也是合并命令,rebase和merge的区别是,合并后节点信息不一样,如下图所示:

《Git时间:常用Git命令收集整理(持续更新)》

同步远程服务器数据到本地:

$ git fetch origin

从新添加的远程仓库下载数据:

$ git remote add teamone git://git.team1.ourcompany.com
$ git fetch teamone

分化一个新的分支:(使用这个命令会从服务器上下载master最新的版本,所以如果当前本地版本不是最新的,新的分支和本地分支会不同)

$ git checkout -b test1 origin/master

假如你用这个新的分支进行git push,并且通过了合并,那么会在远程仓库建立一个新的同名分支,删除该分支:

$ git push origin :test1

衍合(这个比较高级)

根据当前分支(也就是要进行衍合的分支test1)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以主干分支master最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3’),从而改写 test1 的提交历史,使它成为master分支的直接下游:

《Git时间:常用Git命令收集整理(持续更新)》

分支的衍合:将test1分支衍合到master主分支

$ git checkout test1
$ git rebase master

另一种方法,直接衍合,不用再先切换到test1

$ git rebase master test1

《Git时间:常用Git命令收集整理(持续更新)》

快进master分支

$ git checkout master
$ git merge client

《Git时间:常用Git命令收集整理(持续更新)》

注意衍合:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

版本回退(reset)

一般在版本回退之前会先用 $ git status 命令查看当前状态:

$ git status

后退操作reset:(回档某个文件,比如文件 ;其中 HEAD信息可通过 $ git log命令查看)

$ git reset HEAD <filename>

储藏(Stash)

为完成一项紧急需求需要切换到其他分支,而你正在做的工作处于比较杂乱的状态,此时就可以储藏,使用命令:

$ git stash

查看所有储藏:

$ git stash list

重新应用指定储藏:(如不指定 stash@{o} ,则默认应用最近stash)

$ git stash apply stash@{o}

删除指定储藏:

$ git stash drop stash@{o}

未完待续,此篇博客会长期更新补充(^o^)/~

    原文作者:布鲁克林一棵树
    原文地址: https://www.cnblogs.com/wondertwo/p/5718338.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞