git常用命令

1.git 常用参数配置
2.git基础知识
3.git常用操作

1.git 常用参数配置

查看所有配置参数:
git config -l

查看帮助:
git config --help

查看本地仓库git忽略大小写是打开还是关闭,如果忽略大小写可能因为大小写而引发冲突
git congfig --get core.ignorecase

配置git user.name & user.email:
git config --global user.name "xxx"
git config --global user.email "xxx@test.com"
也可以使用:
git config --global --replace-all user.name "xxx"
git config --global --replace-all user.email "xxx@test.com"
查看参数配置
git config user.name
git config user.email
git config -l |grep user

禁用所有分支的fast forward,即默认设置为--no-ff:
git config merge.ff false

禁用指定分支"master"的fast forward:
git config branch.master.mergeoptions "--no-ff"


2.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> //撤销指定的提交、对指定的commit进行反做操作(注意该commit不是回归到的点,而是针对该点进行反做操作)
git log --before="1 days" //退回到之前1天的版本

git reset --hard <commit> //【谨慎使用】
                            把HEAD移到<commit> 就是把你现在这个branch的最新的commit移到你指定的commit,
                            --hard参数会丢弃commit之后的所有修改和提交记录(repo & staging & working)
                            对于已经push到源端的回退操作也适用,会回退本地和远程仓库
                            【谨慎使用】

例如:commit1-->commit2-->commit3(当前最新点)
git reset --hard commit1 //会丢弃commit2和commit3的所有修改、提交记录也会被清除,回退到commit1的最近提交状态
git push -f //-f强制push,如果是保护分支、需要先去掉保护才能强制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查看历史记录。


3.git常用操作

撤销指定的提交

可以通过revert(反做),也可以通过reset(回退)

git reset
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。例如:版本1-->版本2-->版本3(master, HEAD的位置),如果想要回退到版本1,版本1之后的都不要了,则可以用reset,rest后版本2和版本3就看不到了。
执行命令:
git reset --hard commit1
git push -f  //使用-f强制push,此时如果用git push会报错,因为我们本地库HEAD指向的版本比远程库的要旧

git revert
git revert是用于"反做"某一个版本,以达到撤销该版本的修改的目的。例如:commit了三个版本(版本1、版本2、 版本3),如果发现版本2有bug,想要撤销版本2,但又不想影响撤销版本3的提交,就可以用revert来反做版本2,revert执行后会生成新的版本4,这个版本4里会保留版本3的内容,但撤销了版本2的内容。
执行命令:
git revert fe364303
git push

分支与标签操作
git branch //显示所有本地分支
git checkout <branch/tag> //切换分支/标签
git tag //列出所有本地tag
git ls-remote --tags origin //列出远程所有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  //合并以后就可以删除分支了

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

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 remote show origin   //操作之前先查看状态,包括远程分支和本地分支的对应状态
git fetch -p  //该命令等同于: git remote prune origin

推送本地分支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分支的创建时间和commitId

git reflog show --date=iso <branch name>

列出本地分支

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
 

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

拉取远程分支到本地

查看所有分支(本地分支+远程分支):
git branch -a

git checkout -b 本地分支xxx origin/远程分支xxx
会在本地新建分支xxx,并自动切换到该本地分支xxx。采用此种方法建立的本地分支会和远程分支建立映射关系。

例如:
git checkout -b branch-V1.0.0SP01 origin/branch-V1.0.0
git branch
当前已切换到新的分支 branch-V1.1.0SP01

方式二
git fetch origin 远程分支名xxx:本地分支名xxx
会在本地新建分支xxx,但是不会自动切换到该本地分支xxx,需要手动 git checkout 本地分支xxx

例如:
git fetch origin branch-V1.0.0:branch-V1.0.0SP01     //同步远程分支到本地分支(创建本地分支&同步)
git branch                                           //查看本地分支,*开头的代表是当前分支
git checkout branch-V1.0.0SP01                       //切换到新创建的本地分支
git branch
 

修改最近一次commit提交

git commit --amend 

会弹出 vi 界面,可修改最近一次提交的 message 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值