zoukankan      html  css  js  c++  java
  • git的一些常用命令

    Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等。顾名思义,版本控制系统主要就是控制、协调各个版本的文档内容的一致性,这些文档包括但不限于代码文件、图片文件等等。早期SVN占据了绝大部分市场,而后来随着Git的出现,越来越多的人选择将它作为版本控制工具,社区也越来越强大。相较于SVN,最核心的区别是Git是分布式的VCS,简而言之,每一个你pull下来的Git仓库都是主仓库的一个分布式版本,仓库的内容完全一样,而SVN则不然,它需要一个中央版本库来进行集中控制。采用分布式模式的好处便是你不再依赖于网络,当有更改需要提交的时候而你又无法连接网络时,你只需要把更改提交到本地的Git仓库,最后有网络的时候再把本地仓库和远程的主仓库进行同步即可。当然,分布式和非分布式各有各的优缺点,但是目前来看,分布式的Git正逐渐被越来越多的人所接受并推广。

    以下是git的一些常用命令

    • git init :在本地新建一个repo仓库,进入一个项目目录,执行git init,会初始化一个repo仓库,其中会新建一个名为.git的文件夹。
    • git clone :获取一个url对应的远程git repo,创建一个local copy。一般命令格式为 git clone [url] 。clone下来的repo会以url最后一个斜线后面的名称命名,创建一个文件夹,如果想要指定特定的名称,可以用 git clone [url] [repo-name] 这样的命令。
    • git status :查询repo的状态。git status -s 其中的 -s 表示short,-s的输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言。
    • git log :显示一个分支的提交历史。

        git log --oneline --number :每条log只显示一行,显示number条。

        git log --oneline --graph : 可以图形化地表示出分支合并历史。

        git log branchname : 可以显示特定分支的log。

        git log --oneline branch1 ^branch2,可以查看在分支1,却不在分支2中提交。^表示排除这个分支(window下可能要给^branch2加上引号)。

        git log --decorate : 会显示出tag信息。

        git log --author=[author name] : 可以指定作者的提交历史。

        git log --since --before --until --after 根据提交时间筛选log。

        --no-merges可以将merge的commits排除在外。

        git log --grep : 根据commit信息过滤log(git log --grep=keywords)

        默认情况下,git log --grep --author 是OR的关系,即满足一条即被返回,如果你想让它们是and的关系,可以加上 --all-match 的option。

        git log -S : 引进diff来过滤,比如: git log -SmethodName(注意S和后面的词之间没有等号分隔)。

        git log -p :  在每次提交时显示引进的补丁。每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch显示出来。另一种方法是git show [SHA] 。

        git log stat : 在每次提交时显示引入的更改的差异。同样是用来看改动的相对信息的,--stat比-p的输出更简单一些。

    • git add :在提交之前,Git有一个暂存区(staging area),可以放入新添加的文件或者加入新的改动。commit时提交的改动是上一次加入到staging area中的改动,而不是存储介质上的改动。git add . 会递归地添加当前工作目录中的所有文件。
    • git diff :

        不加参数的git diff :比较工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

        若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff cache命令。(Git 1.6.1及以上版本还允许使用 git diff --staged,效果是相同的)

        git diff HEAD :显示所有暂存的或者存储的修改,即比较working directory和上次提交之间所有的改动。

        如果想看自从某个版本之后都改动了什么,可以用 :git diff [version tag] 跟log命令一样,diff也可以加上 --stat 参数来简化输出。

        git diff [branchA] [branchB] 可以用来比较两个分支。它实际上会返回一个由A到B的patch,不是我们想要的结果。一般我们想要的结果是两个分支分开以后各自的改动都是什么,是由命令:git diff [branchA]...[branchB] 给出的。实际上它是:git diff $(git merge-base [branchA] [branchB]) [branchB]的结果。

    • git commit : 提交已经被add进来的改动。

        git commit -m "the commit message"

        git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存)。对于没有track的文件,还是需要git add一下。

        git commit --amend 增补提交。会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。

    • git reset : 取消改动和提交。

        git reset HEAD --filename: 这里的HEAD关键字指的是当前分支最末梢最新的一个提交。也就是版本库中该分支上的最新版本。这个命令用来把不小心add进去的文件从缓存状态取出来,可以单独针对某一个文件操作 ,这个--filename中的--也可以不加。

        git reset --soft : 移动HEAD到特定的提交引用,索引和缓存的不会改变。

        git reset --hard :  取消缓存文件并且取消工作目录上自从上次提交的任何更改。

        使用 git reset --hard HEAD 进行reset,即上次提交之后,所有缓存的改动和工作目录的改动都会消失,还原到上次提交的状态。

        这里的HEAD可以被写成任何一次提交的SHA-1 。不带soft和hard参数的 git reset,实际上带的是默认参数的mixed。

        总结:

        git reset --mixed id,是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变)。取消了commit和add的内容。

        git reset --soft id,实际上,是git reset -mixed id后,又做了一次git add。即取消了commit的内容。

        git reset --hard id,是将git的HEAD变了,文件也变了。

        按改动范围排序如下 :soft(commit) < mixed(commit+add) < hard(commit + add + local working)

    • git revert : 反转撤销提交。只要把出错的提交(commit)的名字(reference)作为参数传给命令就可以了。

        git revert HEAD : 撤销最近的一个提交。

        git revert 会创建一个反向的新提交,可以通过参数-n来告诉Git先不要提交。

    • git rm :

        git rm file :从staging区移除文件,同时也移除出工作目录。

        git rm --cached : 从staging区移除文件,同时也移除出工作目录。从功能上等同于  git reset HEAD,清除了缓存区,但不动工作目录树。

    • git clean : 是从工作目录中移除没有track的文件。通常的参数是 git clean -df,其中 -d 表示同时移除目录, -f表示force,因为在git的配置文件中,clean.requireForce=true,如果不加-f,clean将会拒绝执行。
    • git mv :移动文件。
    • git stash :把当前的改动压入一个栈。git stash 将会把当前目录和index中的所有改动(但不包括未track的文件)压入一个栈,然后留给你一个clean的工作状态,即处于上一次最新提交处

        git stash list : 会显示出这个栈的list。

        git stash apply :取出stash中的上一个项目(stash@{0}),并且应用于当前的工作目录。也可以指定别的项目,比如 git stash apply stash@{1} 。如果你在应用stash中项目的同时想要删除它,可以用 git stash pop。

        删除stash中的项目:

          git stash drop : 删除上一个,也可指定参数删除指定的一个项目。

          git stash clear : 删除所有项目。

    • git branch : 可以用来列出分支,创建分支和删除分支。

          git branch -v : 可以看见每一个分支的最后一次提交。

          git branch (branchname) : 创建一个新的分支(当你用这种方式创建分支的时候,分支是基于你的上一次提交建立的)。

          git branch -d (branchname) : 删除一个分支。

          删除remote的分支 :

          git push (remote-name) :(branch-name): delete a remote branch

          这个是因为完整的命令形式是:

          git push remote-name local-branch:remote-branch

          而这里local-branch的部分为空,就意味着删除了remote-branch

    • git checkout branchname : 切换到一个分支。

          git checkout -b (branchname) : 创建并切换到新的分支。

          这个命令是将 git branch newbranch和git checkout newbranch合在一起的结果。

          checkout还有一个作用:替换本地改动:

          git checkout --filename : 此命令会使用HEAD中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。

          注意:git checkout filename 会删除该文件中所有没有暂存和提交的改动,这个操作是不可逆的。

    • git merge : 把一个分支合并入当前的分支。 git merge [alias]/[branch] : 把远程分支合并到当前分支。

        如果出现冲突,需要手动修改,可以用git mergetool。

        解决冲突的时候可以用到git diff,解决完之后用git add添加,即表示冲突已经被解决了。

    • git tag : 标记某个历史时间点用于导入。会在一个提交上建立永久性的标签,通常是发布一个版本或者装载了什么东西之后加上标记,比如 git tag v1.0 。

        git tag -a v1.0,-a参数会允许你添加一些信息,即做一个带注释的标记,当你运行git tab -a命令的时候,Git会打开一个编辑器让你输入标记信息。

        我们可以利用 commit SHA来给一个过去的提交做标记 git tag -a v0.9 XXXX。

        push的时候是不包含标记的,如果想包含,可以在push时加上--tags参数。

        fetch的时候,branch HEAD可以拿到tags是被自动fetch下来的,从分支头无法到达的标签将被略过。如果想确保所有标签都被包含进来,需要加上--tags选项。

    • git remote : 列出/添加/删除 远程仓库别名。因为不需要每次都用完整的url,所以Git为每一个remote repo的url都建立一个别名,然后用git remote来管理这个列表。

        git remote : 列出远程仓库别名。如果你克隆一个项目,Git会自动将原来的url添加进来,别名就叫origin。

        git remote -v : 可以看见每一个别名对应的实际url。

        git remote add [alias] [url] : 添加一个新的remote repo。

        git remote rm [alias] : 删除一个存在的remote alias。

        git remote rename [old-alias] [new-alias] : 重命名。

        git remote set-url [alias] [url] : 更新url。可以加上--push和fetch参数,为同一个别名set不用的存取地址。

    • git fetch : 从远程仓库下载新的分支和数据。可以使用git fetch [alias] 取某一个远程repo,也可以git fetch --all取到全部repo。fetch将会取到所有你本地没有的数据,所有取下来的分支可以被叫做远程分支,它们和本地分支一样(可以看diff,log等,也可以合并到其他分支),但是git不允许你检出它们。
    • git pull : 从远程仓库fetch,并尝试合并到当前的分支,pull == fetch + merge FETCH_HEAD,git pull会首先执行git fetch,然后执行git merge,把取来的分支的head合并到当前分支。这个合并操作会产生一个新的提交。如果使用--rebase参数,它会执行git rebase来取代原来的git merge。
    • git rebase : --rebase 不会产生合并的提交,它会将本地的所有提交临时保存为补丁(patch),放在".git/rebase"目录中,然后将当前分支更新到最新的分支尖端,最后把保存的补丁应用到分支上。

        rebase的过程中,也许会出现冲突,Git会停止rebase并让你解决冲突,在解决完冲突之后,用git add去更新这些内容,然后无需执行commit,只需要:

        git rebase --continue 就会继续打余下的补丁。

        git rebase --abort 将会终止rebase,当前分支将会回到rebase之前的状态。

    • git push :推送新的分支和数据到远程仓库。git push [alias] [branch] 将会把当前分支合并到alias上的 [branch]分支。如果分支已经存在,将会更新,如果不存在,将会添加这个分支。

        如果有多个人向同一个远程仓库push代码,Git会首先在你试图push的分支上运行git log,检查它的历史中是否能看到服务器上的分支和现在的tip,如果本地历史中不能看到服务器的tip,说明本地的代码不是最新的,Git会拒绝你的push,让你先fetch和merge,之后再push,这样就保证了所有人的改动都会被考虑进来。

    • git reflog : 是对reflog进行管理的命令,reflog是git用来记录引用变化的一种机制,比如记录分支的变化或者是HEAD引用的变化。当git reflog不指定引用的时候,默认列出HEAD的reflog。

        HEAD@{0}代表HEAD当前的值,HEAD@{3}代表HEAD在3次变化之前的值。git会将变化记录到HEAD对应的reflog文件中,其路径为 .git/logs/HEAD ,分支的reflog文件都放在 .git/logs/HEAD,分支的reflog文件都放在 .git/logs/refs目录下的子目录中。

    • 特殊符号:

        ^代表父提交,当一个提交有多个父提交时,可以通过在^后面跟上一个数字,表示第几个父提交:^相当于^1。

        ~<n>相当于连续的<n>个^。

  • 相关阅读:
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    205. Isomorphic Strings
    204. Count Primes
    203. Remove Linked List Elements
    201. Bitwise AND of Numbers Range
    199. Binary Tree Right Side View
    ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
  • 原文地址:https://www.cnblogs.com/yu412/p/11649282.html
Copyright © 2011-2022 走看看