git常用命令

来源:互联网 发布:centos改成中文 编辑:程序博客网 时间:2024/06/08 11:45

git基础知识:

git提交的3个流程:working tree -> index file -> commit
working tree:工作目录,修改代码则working tree的状态会改变
index file:索引文件也叫暂存区域快照(staged),例如git add执行会改变index file,保持和working tree的同步
commit:提交操作,修改提交以后,代码就入git仓库了。git commit执行会将index file的内容提交到commit中。

git add
git add <path> //把<path>文件信息添加到索引库中,git commit提交时依据索引库中的内容来进行文件的提交。注意:如果new file,必须先用执行git add。否则直接git commit -a 不会将新文件staged
git add -A [<path>] //把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。省略<path>表示.,即当前目录
git add -u [<path>] //把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。但它不会处理untracted的文件
git add -i [<path>] //查看<path>中被所有修改过或已删除文件但没有提交的文件

git reflog //可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录。git log则不能察看已经删除了的commit记录

git log  //查看历史提交信息,简要信息
git log -p //查看历史提交信息详情,显示每一次提交与其父节点提交内容之间快照的差异

git show <commit-id>

git diff
git diff [<path>...] //查看working tree与index file的差异,还没暂存(staged)的文件的修改内容,比较的是工作区的文件和快照的差异
git diff --cached | --stage [<path>...] //查看index file与commit的差别的,下次提交的差异(不带-a的情况下)。显示的是载入(staged)而并未提交(not committed)的内容差异
git diff HEAD [<path>...] //显示当前工作区和HEAD的差异
git diff bugfix001...master //显示自bugfix001分支和master分支分别开发以来,master分支上的changed。
git diff master...bugfix001 //显示master分支和bugfix01分支的差异,bugfix001分支上的changed。
git diff commitId  [<path>...] //显示作区与指定commit-id的差异
git diff [<commit-id>] [<commit-id>]  //比较2个commit-id的差异

git status //查看状态,可以显示已经暂存(staged)的文件,未暂存的文件(Untracked),如果没有git add,会提示
Unmerged paths:
use "git add <file>..." to mark resolution

所以git提交之前,最好都用git status查看一下状态是否OK。

git commit -m "xxx" //提交
git commit -a -m "desc-msg-for-commit"  //-a选项可只将所有被修改或者已删除的且已经被git管理的文档提交倒仓库中,如果只是修改或者删除了已被Git管理的文档,是没必要使用git add命令的
-a参数:
官方解释:Tell the command to automatically stage files that have been modified and >deleted, but new files you have not told Git about are not affected.
自动把当前所有修改和删除文件放到栈上,但你没有添加过的不会受影响。

git commit --amend //也可以用git reset HARD取消最后一次提交,然后再来过。
git commit --amend 常常用来修改某个branch上最顶端的commit。大多数情况下,这个命令给人的感觉是用新的commit替换了原来的commit。
git commit –-amend 会打开vi编辑界面,直接修改提交信息以后,vi保存退出以后,通过git log可插件提交信息已经修改,该方法提交记录的commitid会变化。
push -f 如果上一次的提交已经push了,那么需要加-f参数覆盖远程服务端,不过不建议这么搞

当前修改如果已经通过git add <changed_files>将其添加到stage,那么可以通过执行git commit -m "xxx"为这所有已经进入stage的改变添加一个commit信息。
但是如果你的文件之前已经提交过,但这次的改动还没有进stage,则必须先执行git add添加到暂存区(stage),然后再执行git commit -m "xxx"提交。
这个2个过程,可以通过执行一条命令:git commit -a -m "xxx" 来完成。这一条命令完成2个动作:将所有修改但未进stage的改动加入stage,并且添加一个commit信息。
但是要注意 git commit -a -m "xxx" 自动加入stage是有个前提条件的,前提是:被改动文件已经是tracked。对于Untracked的文件,无效,必须先手动执行git add添加到stage。

git push
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master //将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建
git push origin :master //等同git push origin --delete master,如果省略本地分支名,则表示删除指定的远程分支,删除origin主机的master分支。因为这等同于推送一个空的本地分支到远程分支
git push origin //将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略,直接用git push
git push //不带任何参数的git push,默认只推送当前分支,这叫做simple方式。另外还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令配置,
git config --global push.default matching
git config --global push.default simple   //一般推荐设置为simple,否则低于2.0的git版本,默认为matching,会推送所有有对应的远程分支的本地分支,一般这不是我们想要的结果,往往我们只需要推送当前分支到远程。

push常用的选项
-u
git push -u origin master //如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数,直接使用git push了
--all
git push --all origin //将所有本地分支都推送到origin主机
--force
git push --force origin //如果push时,远程主机的版本比本地版本更新,推送时会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。如果想强制push,可以使用--force选项,这样会导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge),一般不推荐使用--force
--tags  //标签操作
git push origin --tags //git push不会推送标签(tag),除非使用-–tags,推送所有的本地tag到远程
git push origin tag_name  //推送指定的tag到远程
git push origin :tag_name  //删除远程的tag

撤销操作
git reset --hard HEAD //撤销工作目录中所有未提交文件的修改内容
git checkout HEAD <file> //撤销指定的未提交文件的修改内容
git revert <commit> //撤销指定的提交
git log --before="1 days" //退回到之前1天的版本

如果还没有push:
git reset [--hard|soft|mixed|merge|keep] [<commit> | HEAD]
将当前的分支重设(reset)到指定的<commit>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index file和working directory。mode的取值可以为hard、soft、mixed、merged、keep。

--mixed:会保留源码,只是将git commit和index file信息回退到了某个版本。
--soft:保留源码,只回退到commit信息到某个版本。不涉及index file和working directory中内容的回退,如果还需要提交,可以直接执行commit即可。仅仅把HEAD指向<commit>。
--hard:源码也会回退到某个版本,commit和index file都会回退到某个版本,重设(reset)index file和working directory,自<commit>以后在working directory中的任何改变都被丢弃,并把HEAD指向<commit>。 

举例:
git status 
commit3: add fiel3.c
commit2: add file2.c
commit1: add file1.c

git reset --soft  //不指定commit,默认为HEAD~1
git log 查看结果

git commit -am "xxx" //提交以后,需要回滚
git reset --hard HEAD~3  //回归最近3次提交,永久删除(working directory中的内容也回滚了,修改被丢弃了,谨慎使用)
git reset --soft HEAD~3  //

如果已经push了:
已经把代码push到远程仓库了,现在想回退本地代码、同时也想回退远程代码,回滚到某个指定的版本,本地和远程代码想保持一致。则需要用到revert命令:

git revert
回滚某个commit,而不是回滚到某个commit。
用于反转提交,执行revert命令时要求工作树必须是干净的,git revert用一个新提交来消除一个历史提交所做的任何修改。
git revert 之后本地代码会回滚到指定的历史版本,这时再通过git push既可以把线上的代码更新(这里不会像reset造成冲突的问题)。
git revert 使用时,首先需要明确找到你想回滚版本唯一的commit-id,可以用git log查看历史记录。

常用操作:
git revert fe364303
git push

分支与标签操作
git branch //显示所有本地分支
git checkout <branch/tag> //切换分支/标签
git tag //列出所有本地tag
git tag <tag_name> //基于最新提交创建标签,创建的标签为轻量级标签,无需任何参数,显示时也只有摘要信息,无附注信息
git tag -d  //删除本地标签
git tag -a V1.0.0 -m 'my version 1.0.0' //新建一个含附注类型的标签,-m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
git tag -a V1.0.0 //使用了-a,但没有-m参数,git会启动文本编辑软件供你输入标签说明
git tag -a V1.0.0 commit-id //为指定的commit-id提交打本地标签tag,用于后期针对某个commit-id点追加标签
git tag -a V1.0.0 9fceb02 

git push origin V1.0.0 //推送指定标签
git push origin --tags //推送所有标签

========================

git merge的--no-ff参数

git merge [--no-ff] branch_name

--no-ff是为了修整提交线图。避免形成一条直线,而是显示出提交线图分叉出来。

如果不加参数--no-ff,默认的merge方式是fast-forwarded。不会显示 feature,只保留单条分支记录。

如果加了参数--no-ff,可以保存你之前的分支历史,能够更好的查看 merge历史,以及branch 状态。


git创建本地分支&切换到新的分支(create and checkout a new branch)

$ git checkout -b hotfix001

Switched to a new branch 'hotfix001'

该命令等同于下面2条命令:

$ git branch hotfix001

$ git checkout hotfix001


git切换到指定的分支

$ git checkout <branch>

$ git checkout master


分支合并与删除(hotfix001合并回master为例)

$ git checkout master

$ git merge --no-ff hotfix001 //或git merge hotfix001

$ git branch -d hotfix001  //合并以后就可以删除分支了


release分支合并回master进行同步(基于master准备拉取pre-release之前的同步合并)

$ git checkout master

$ git merge --no-ff release


合并pre-release分支到master

$ git checkout master

$ git merge --no-ff pre-release


合并pre-release分支到release

$ git checkout release

$ git merge --no-ff  pre-release


删除掉没有与远程分支对应的本地分支

git fetch -p

git remote prune origin

操作之前,可以通过  git remote show origin 查看状态,包括远程分支和本地分支的对应状态。


创建本地分支 & 切换分支

git branch localBranch

git checkout localBranch

两条命令等同于下面这条命令:git checkout -b localBranch


推送本地分支到远程

git push origin localBranch


推送本地分支localBranch到远程分支remoteBranch并建立关联关系

  1)远程已有remoteBranch分支,且已经关联本地分支localBranch,且本地已经切换到localBranch:

    git push

  2)远程已有remoteBranch分支,但未关联本地分支localBranch,且本地已经切换到localBranch:

    git push -u origin/remoteBranch

  3)远程还没有remoteBranch分支,本地已经切换到localBranch:

    git push origin localBranch:remoteBranch

    或

    git push origin localBranch   //如果不需要更名直接可用这个


基于指定的tag创建新的分支

git branch myNewBranch tagName   //创建分支

git checkout myNewBranch         //切换到新的分支

git push origin myNewBranch      //推送本地分支到远程


删除本地分支

git branch -d | -D localBranch

注意:

1.不能删除当前checkout的分支。

2.如果xx分支有没有合并到当前分支的内容,需要使用-D强制删除。


删除远程分支

git push origin :old_localBranch


git branch -d -r branchname

注意:删除远程分支,需要切换到其它分支之后删除当前分支。



重命名本地分支

git branch -m | -M oldbranch newbranch

如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名。


重命名远程分支:要多步骤操作

Step1:重命名远程分支对应的本地分支

git branch -m old_local_branch_name new_local_branch_name

step2:删除远程分支

git push origin :old_local_branch_name

step3:重新推送新命名的本地分支

git push origin new_local_branch_name


查看当前目录的git状态

git status

能列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件。

命令中“Changes to be committed“中所列的内容是在Index中的内容,commit之后进入Git Directory。

命令中“Changed but not updated”中所列的内容是在Working Directory中的内容,add之后将进入Index。

命令中“Untracked files”中所列的内容是尚未被Git跟踪的内容,add之后进入Index。

通过git status -uno可以只列出所有已经被git管理的且被修改但没提交的文件。


查看本地分支

git branch

列出本地已经存在的分支,并且在当前分支的前面加“*”号标记


列出远程分支

git branch -r


列出本地分支和远程分支

git branch -a

查看分支信息

git remote show [remote-name]

查看远程分支和本地分支的对应关系

git remote show origin


如果存在远程分支已经删除,本地还分支还未删除可通过该命令查看对应关系

git remote show origin

会看到:

refs/remotes/origin/my_branch                        stale (use 'git remote prune' to remove)

执行:

git remote prune origin  或  git fetch -p

再执行

git remote show origin

就看不到了


列出已经存在的远程分支

git remote


列出已经存在的远程分支详细信息,在每一个名字后面列出其远程url

git remote -v

删除tag

Step1: 显示本地tag

git tag

mytag

Step2: 删除本地tag

git tag -d mytag

Step3: 删除远程tag

git push origin :refs/tags/mytag



原创粉丝点击