zoukankan      html  css  js  c++  java
  • Git时间:常用Git命令收集整理(持续更新)

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


    基础概念Repositiry

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

    repository


    配置用户信息(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信息可以用下图表示:

    HEAD

    查看当前的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分支

    查看当前分支:(当前分支默认为 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的区别是,合并后节点信息不一样,如下图所示:

    merge&rebase

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

    $ 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分支的直接下游:

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

    $ git checkout test1
    $ git rebase master
    

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

    $ git rebase master test1
    

    快进master分支

    $ git checkout master
    $ git merge client
    

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


    版本回退(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)/~

  • 相关阅读:
    基于HSharp使用C#对象建立并输出HTML
    基于HSharp 使用C#反序列化HTML并获取HTML中的特定内容
    iis最大连接数和队列长度
    强网拟态 2021 showyourflag Writeup
    ByteCTF 2021 bytecert Writeup
    基于 OpenSSL 的 RSA 消息加密及签名实现
    思维导图-2020的目标
    我的第一个博客
    【网络流24题】洛谷P4015 运输问题
    CSP/NOIP 防爆指南
  • 原文地址:https://www.cnblogs.com/wondertwo/p/5718338.html
Copyright © 2011-2022 走看看