zoukankan      html  css  js  c++  java
  • git 命令

    新建代码库

    在当前目录新建一个Git代码库
    $ git init
    
    新建一个目录,将其初始化为Git代码库
    $ git init [project-name]
    
    下载一个项目和它的整个代码历史
    $ git clone [url]

    配置

    Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

    显示当前的Git配置
    $ git config --list
    
    编辑Git配置文件
    $ git config -e [--global]
    
    设置提交代码时的用户信息
    $ git config [--global] user.name "[name]"
    $ git config [--global] user.email "[email address]"
    
    配置使用git仓库的人员姓名
    配置使用git仓库的人员email
    git config --global user.name "weihainna"
    git config --global user.email "weihainanmail@126.com"
    配置到缓存 默认15分钟
    git config --global credential.helper cache 
    修改缓存时间
    git config --global credential.helper 'cache --timeout=3600'  
    配置命令行颜色
    git config --global color.ui true
    配置别称
    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.st status
    git config --global alias.br branch
    git config --global core.editor "mate -w" 设置Editor使用textmate
    git config -1 列举所有配置
    
    配置中文  /etc/inputrc
    disable/enable 8 bit input
    set meta-flag on
    set input-meta on
    set output-meta on
    set convert-meta on
    /etc/profile
    declare -x LESSCHARSET=utf-8

    基本操作

    添加
    git add <file>   将工作文件修改提交到本地暂存区
    git add .将所有修改过的工作文件提交暂存区
     添加指定文件到暂存区
    $ git add [file1] [file2] ...
     添加指定目录到暂存区,包括子目录
    $ git add [dir]
     添加当前目录的所有文件到暂存区
    $ git add .
     添加每个变化前,都会要求确认
     对于同一个文件的多处变化,可以实现分次提交
    $ git add -p
    
    提交 commit
    git ci <file>
    git ci .
    git ci -a将git add, git rm和git ci等操作都合并在一起做
    git ci -am "some comments"
    git ci --amend   修改最后一次提交记录
     提交暂存区到仓库区
    $ git commit -m [message]
    提交你的修改  
    git commit –m "你的注释"  
     提交暂存区的指定文件到仓库区
    $ git commit [file1] [file2] ... -m [message]
     提交工作区自上次commit之后的变化,直接到仓库区
    $ git commit -a
     提交时显示所有diff信息
    $ git commit -v
     使用一次新的commit,替代上一次提交
     如果代码没有任何新变化,则用来改写上一次commit的提交信息
    $ git commit --amend -m [message]
     重做上一次commit,并包括指定文件的新变化
    $ git commit --amend [file1] [file2] ...
    
    修改--add--暂存区--commit--本地库
    每次修改如果不add就不会加入暂存区,commit时就不会提交
    
     删除工作区文件,并且将这次删除放入暂存区
    $ git rm [file1] [file2] ...
     停止追踪指定文件,但该文件会保留在工作区
    $ git rm --cached [file]
    git rm <file>从版本库中删除文件
    git rm <file> --cached   从版本库中删除文件,但不删除文件
    从当前跟踪列表移除文件,并完全删除  
    git rm readme.txt  
    仅在暂存区删除,保留文件在当前目录,不再跟踪  
    git rm –cached readme.txt  
    
    假设你已经使用git add .,将修改过的文件a、b加到暂存区  
    现在你只想提交a文件,不想提交b文件,应该这样  
    git reset HEAD b  
    
     改名文件,并且将这个改名放入暂存区
    $ git mv [file-original] [file-renamed]
    
    
    查看文件状态  
    git status  比较工作区 缓存区 版本库
    git statys -s
    M  test.txt
    --第一个M表示暂存区与版本库不一样
    --第二个M表示暂存区与工作空间不一样
    
    
    取消对文件的修改  
    git checkout -- readme.txt 退回到最近一次add或commit的状态  
    直接丢弃工作区的修改 无论修改还是删除 都可以一键还原
    
    
    

    比较 日志

    git diff
    git diff HEAD -- readme.txt 工作区与版本库差别
    git diff --staged   暂存区和版本库中的差异
    --git diff 工作空间与暂存区比较
    --git diff HEAD 工作区和HEAD比较 git diff HEAD -- readme.txt  查看版本库与临时区文件区别
    --git diff --cached 暂存区与HEAD比较
    
     显示暂存区和工作区的差异
    $ git diff
     显示暂存区和上一个commit的差异
    $ git diff --cached [file]
     显示工作区与当前分支最新commit之间的差异
    $ git diff HEAD
     显示两次提交之间的差异
    $ git diff [first-branch]...[second-branch]
     显示今天你写了多少行代码
    $ git diff --shortstat "@{0 day ago}"
    
    git diff <file>  比较当前文件和暂存区文件差异  
    git diff  
    git diff <$id1> <$id2>比较两次提交之间的差异  
    git diff <branch1>..<branch2>  在两个分支之间比较  
    git diff --staged比较暂存区和版本库差异  
    git diff --cached比较暂存区和版本库差异  
    git diff --stat  仅仅比较统计信息 
    
    git log
    git log --pretty=oneline
    git log --pretty=oneline --abbrev-commit
    查看提交记录
    git log <file>   查看该文件每次提交记录  
    git log -p <file>查看每次详细修改内容的diff  
    git log -p -2查看最近两次详细修改内容的diff  
    git log --stat  查看提交统计信息  
    
    
    git log 查看提交日志
    git log -pretty=oneline
    
     显示当前分支的版本历史
    $ git log
    $ git log --pretty=oneline
     显示commit历史,以及每次commit发生变更的文件
    $ git log --stat
     搜索提交历史,根据关键词
    $ git log -S [keyword]
     显示某个commit之后的所有变动,每个commit占据一行
    $ git log [tag] HEAD --pretty=format:%s
     显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
    $ git log [tag] HEAD --grep feature
     显示某个文件的版本历史,包括文件改名
    $ git log --follow [file]
    $ git whatchanged [file]
     显示指定文件相关的每一次diff
    $ git log -p [file]
     显示过去5次提交
    $ git log -5 --pretty --oneline
     显示所有提交过的用户,按提交次数排序
    $ git shortlog -sn
     显示指定文件是什么人在什么时间修改过
    $ git blame [file]
     显示所有提交过的用户,按提交次数排序
    $ git shortlog -sn
     显示指定文件是什么人在什么时间修改过
    $ git blame [file]
     显示某次提交的元数据和内容变化
    $ git show [commit]
     显示某次提交发生变化的文件
    $ git show --name-only [commit]
     显示某次提交时,某个文件的内容
    $ git show [commit]:[filename]
    
     显示当前分支的最近几次提交
    $ git reflog
    git reflog  查看命令的执行日志
    
    Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
    $ git stash
    用git stash list命令看看“储藏”的工作现场:
    $ git stash list
    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    另一种方式是用git stash pop,恢复的同时把stash内容也删了:
    $ git stash pop
     暂时将未提交的变化移除,稍后再移入
    $ git stash
    $ git stash pop
    Git暂存管理
    git stash 暂存  
    git stash list列所有stash  
    git stash apply   恢复暂存的内容  
    git stash drop删除暂存区
    
    
    

    撤销 回退

     恢复暂存区的指定文件到工作区
    $ git checkout [file]
    
     恢复某个commit的指定文件到暂存区和工作区
    $ git checkout [commit] [file]
    
     恢复暂存区的所有文件到工作区
    $ git checkout .
    
     重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
    $ git reset [file]
    
     重置暂存区与工作区,与上一次commit保持一致
    $ git reset --hard
    
     重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
    $ git reset [commit]
    
     重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
    $ git reset --hard [commit]
    
     重置当前HEAD为指定commit,但保持暂存区和工作区不变
    $ git reset --keep [commit]
    
     新建一个commit,用来撤销指定commit
     后者的所有变化都将被前者抵消,并且应用到当前分支
    $ git revert [commit]
    
    
    git reset --hard HEAD^
    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区
    上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
    git reset --hard 3628164
    git reflog
    git reset --hard master@{1}
    
    回退:
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,
    想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
    git checkout -- file
    git reset HEAD file
    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
    $ git log --pretty=oneline$ git reflog
    $ git reset --hard HEAD^
    $ git reset --hard 3628164
    上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
    HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
    穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
    
    
    git reset <file> 从暂存区恢复到工作文件
    git reset -- .   从暂存区恢复到工作文件
    git reset --hard 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
    git reset --hard HEAD^
    git reset --hard HEAD^^
    git reset --hard HEAD~100
    git reset --hard 3628164
    
    git revert <$id> 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
    git revert HEAD  恢复最后一次提交的状态
    
    git co  -- <file>抛弃工作区修改
    git co  .抛弃工作区修改
    
    
    

    仓库

    取得Git仓库
    初始化一个版本仓库  
    git init  
    
    Clone远程版本库  
    git clone git@xbc.me:wordpress.git  
    $ git clone https://github.com/whnhub/learngit.git 
    
    添加远程版本库origin,语法为 git remote add [shortname] [url]  
    git remote add origin git@xbc.me:wordpress.git  
    
    查看远程仓库  
    git remote -v  
    
    git remote -v 查看远程服务器地址和仓库名称  
    git remote show origin查看远程服务器仓库状态  
    git remote add origin git@ github:robbin/robbin_site.git  添加远程仓库地址  
    git remote set-url origin git@ github.com:robbin/robbin_site.git  设置远程仓库地址(用于修改远程仓库地址)  
    git remote rm <repository>删除远程仓库 
    
    
     下载远程仓库的所有变动
    $ git fetch [remote]
    
     显示所有远程仓库
    $ git remote -v
    
     显示某个远程仓库的信息
    $ git remote show [remote]
    
     增加一个新的远程仓库,并命名
    $ git remote add [shortname] [url]
    
     取回远程仓库的变化,并与本地分支合并
    $ git pull [remote] [branch]
    
     上传本地指定分支到远程仓库
    $ git push [remote] [branch]
    
     强行推送当前分支到远程仓库,即使有冲突
    $ git push [remote] --force
    
     推送所有分支到远程仓库
    $ git push [remote] --all
    
    
    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
    要查看远程库的信息,用git remote:
    $ git remote
    origin
    或者,用git remote -v显示更详细的信息:
    $ git remote -v
    origin  git@github.com:michaelliao/learngit.git (fetch)
    origin  git@github.com:michaelliao/learngit.git (push)
    上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
    
    
    

    分支

    查看分支:git branch
    创建分支:git branch <name>
    切换分支:git checkout <name>
    创建+切换分支:git checkout -b <name>
    合并某分支到当前分支:git merge <name>
    $ git merge --no-ff -m "merge with no-ff" dev
    删除分支:git branch -d <name>
    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
    $ git branch dev
    $ git checkout dev
    
    
     列出所有本地分支
    $ git branch
    
     列出所有远程分支
    $ git branch -r
    
     列出所有本地分支和远程分支
    $ git branch -a
    
     新建一个分支,但依然停留在当前分支
    $ git branch [branch-name]
    
     新建一个分支,并切换到该分支
    $ git checkout -b [branch]
    
     新建一个分支,指向指定commit
    $ git branch [branch] [commit]
    
     新建一个分支,与指定的远程分支建立追踪关系
    $ git branch --track [branch] [remote-branch]
    
     切换到指定分支,并更新工作区
    $ git checkout [branch-name]
    
     切换到上一个分支
    $ git checkout -
    
     建立追踪关系,在现有分支与指定的远程分支之间
    $ git branch --set-upstream [branch] [remote-branch]
    
     合并指定分支到当前分支
    $ git merge [branch]
    
     选择一个commit,合并进当前分支
    $ git cherry-pick [commit]
    
     删除分支
    $ git branch -d [branch-name]
    
     删除远程分支
    $ git push origin --delete [branch-name]
    $ git branch -dr [remote/branch]
    如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
    
    查看、切换、创建和删除分支
    
    git br -r查看远程分支  
    git br <new_branch>  创建新的分支  
    git br -v查看各个分支最后提交信息  
    git br --merged  查看已经被合并到当前分支的分支  
    git br --no-merged   查看尚未被合并到当前分支的分支  
    
    git co <branch>  切换到某个分支  
    git co -b <new_branch>  创建新的分支,并且切换过去  
    git co -b <new_branch> <branch>   基于branch创建新的new_branch  
    
    git co $id   把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除  
    git co $id -b <new_branch>   把某次历史提交记录checkout出来,创建成一个分支  
    
    git br -d <branch>   删除某个分支  
    git br -D <branch>   强制删除某个分支 (未被合并的分支被删除的时候需要强制) 
    
    分支合并和rebase
    git merge <branch>将branch分支合并到当前分支  
    git merge origin/master --no-ff   不要Fast-Foward合并,这样可以生成merge提交  
    
    git rebase master <branch>将master rebase到branch,相当于:  
    git co <branch> && git rebase master && git co master && git merge <branch>   
    
    
    创建一个分支  
    git branch iss53  
    
    切换工作目录到iss53  
    git chekcout iss53  
    
    将上面的命令合在一起,创建iss53分支并切换到iss53  
    git chekcout –b iss53  
    
    合并iss53分支,当前工作目录为master  
    git merge iss53  
    
    合并完成后,没有出现冲突,删除iss53分支  
    git branch –d iss53  
    
    拉去远程仓库的数据,语法为 git fetch [remote-name]  
    git fetch  
    
    fetch 会拉去最新的远程仓库数据,但不会自动到当前目录下,要自动合并  
    git pull  
    
    查看远程仓库的信息  
    git remote show origin  
    
    建立本地的dev分支追踪远程仓库的develop分支  
    git checkout –b dev origin/develop 
    
    
    git pull  抓取远程仓库所有分支更新并合并到本地  
    git pull --no-ff  抓取远程仓库所有分支更新并合并到本地,不要快进合并  
    git fetch origin  抓取远程仓库更新  
    git merge origin/master   将远程主分支合并到本地当前分支  
    git co --track origin/branch  跟踪某个远程分支创建相应的本地分支  
    git co -b <local_branch> origin/<remote_branch>   基于远程分支创建本地分支,功能同上  
    
    git push  push所有分支  
    git push origin master将本地主分支推到远程主分支  
    git push -u origin master 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)  
    git push origin <local_branch>创建远程分支, origin是远程仓库名  
    git push origin <local_branch>:<remote_branch>   创建远程分支  
    git push origin :<remote_branch>  先删除本地分支(git br -d <branch>),然后再push删除远程分支 
    
    git pull
    git push
    git log --graph --pretty=oneline --abbrev-commit
    
    
    

    标签

     列出所有tag
    $ git tag
    
     新建一个tag在当前commit
    $ git tag [tag]
    
     新建一个tag在指定commit
    $ git tag [tag] [commit]
    
     删除本地tag
    $ git tag -d [tag]
    
     删除远程tag
    $ git push origin :refs/tags/[tagName]
    
     查看tag信息
    $ git show [tag]
    
     提交指定tag
    $ git push [remote] [tag]
    
     提交所有tag
    $ git push [remote] --tags
    
     新建一个分支,指向某个tag
    $ git checkout -b [branch] [tag]
    
    
    敲命令git tag <name>就可以打一个新标签:
    $ git tag v1.0
    可以用命令git tag查看所有标签:
    $ git tag
    v1.0
    
    $ git tag v0.9 6224937
    

    rebase


    一、基本
    git rebase用于把一个分支的修改合并到当前分支。
    假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。
    $ git checkout -b mywork origin
    假设远程分支"origin"已经有了2个提交,如图

     
    现在我们在这个分支做一些修改,然后生成两个提交(commit).
    $ vi file.txt
    $ git commit
    $ vi otherfile.txt
    $ git commit
    ...
    但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。

     

    在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

     
    但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:
    $ git checkout mywork
    $ git rebase origin
    这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

     
    当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

     
    二、解决冲突
    在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:
    $ git rebase --continue
    这样git会继续应用(apply)余下的补丁。
    在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。
    $ git rebase --abort
    三、git rebase和git merge的区别
    现在我们可以看一下用合并(merge)和用rebase所产生的历史的区别:

    当我们使用Git log来参看commit时,其commit的顺序也有所不同。
    假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,
    对于使用git merge来合并所看到的commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1
    对于使用git rebase来合并所看到的commit的顺序(从新到旧)是:C7 ,C6‘,C5',C4,C3,C2,C1
     因为C6'提交只是C6提交的克隆,C5'提交只是C5提交的克隆,
    从用户的角度看使用git rebase来合并后所看到的commit的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1
     表示本地当前本地当前分支上。
  • 相关阅读:
    Google验证码Kaptcha的详细过程
    stm32—单总线(1-wire)
    stm32—I2C
    归并排序(MergeSort)
    冒泡排序(Bubble Sort)
    stm32—GPIO
    stm32—时钟系统
    stm32—复位
    转义字符表
    ASCII码表格
  • 原文地址:https://www.cnblogs.com/wihainan/p/6010900.html
Copyright © 2011-2022 走看看