前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看了这篇文章,你应该可以应付工作中90%的git命令

看了这篇文章,你应该可以应付工作中90%的git命令

作者头像
兜兜转转
发布2023-03-08 13:47:13
4130
发布2023-03-08 13:47:13
举报
文章被收录于专栏:CodeTime

开始

git初始化

安装完git 需设置账号和邮箱,用于标示用户身份,类似于svn的账号,但是git不存在服务器,所以无需密码验证身份。 保存位置C:\Users\yourname\\.gitconfig

12

$ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"

仓库初始化和提交

123456

$ git init  #初始化Git工作目录$ git add 文件名或*  #添加文件到暂存区$ git rm 文件名   #从暂存区删除文件$ git commit -m "注释" #提交到版本记录$ git commit --amend --no-edit #修改最后一次提交记录,会生成新的hash但是会作为最后的提交,相当于覆盖最后一次提交,之前的作废。no-edit表示无需修改注释$ git status #查看当前状态

查看记录

12345

$ git log --pretty=oneline #单行显示提交记录$ git log --graph --pretty=oneline --abbrev-commit #可查看分支合并的情况(分支合并图)$ git log -p master  ..origin/master #比较本地的master分支和origin/master分支的差别$ git log filename #显示指定文件在哪些提交下有修改$ git show c5e69 filename #显示指定文件在某个提交下的具体修改

相对引用

HEAD^ 上1级; HEAD^^ 上2级; HEAD^2 当HEAD有2个父节点的时候,HEAD^回到第一个父节点,也就是HEAD正上方的节点,HEAD^2回到第2个父节点; HEAD~4 上面4级,不带数字默认回到上1级; 可链式操作:

1

$ git checkout HEAD~^2~2

撤销操作

1.reset

1

$ git reset --hard HEAD^(上一个版本号,或直接版本号)

hard:工作区=暂存区=HEAD=设置版本 mixed:工作区!=暂存区=HEAD=设置版本 soft:工作区=暂存区!=HEAD=设置版本

1

$ git reset HEAD^(版本号) readme.txt(文件名)

已add到暂存区,还未commit,可从当前版本覆盖到暂存区,即撤销暂存区的修改,之后再checkout就可以撤销工作区内容了 相当于不加参数,默认是mixed。

2.revert

1

$ git revert  HEAD(版本号)

和reset类似都是撤销,区别是reset撤销相当于版本回退,将HEAD指向reset的指定版本。revert撤销是生成一个新commit,该commit消除掉revert指定版本的所有更改,并生成一个新的版本,也就是说生成的版本会和指定版本的上一个版本完全一致。

checkout的用法

1.从暂存区恢复到工作区

1

$ git checkout -- readme.txt(文件名)

工作区修改还未add到暂存区,可以从暂存区覆盖到工作区,即撤销修改 加上占位符—代表后面跟的是文件路径,不加表示的是分支名

2.切换分支

1234

$ git checkout -b dev(分支名) #创建并切换到分支,相当于以下2条语句:$ git branch dev #创建分支$ git checkout dev  #切换分支$ git checkout -b dev origin/dev #创建分支,并且和远程dev分支关联

3.修改HEAD的指向

使Head指向指定的版本,并与当前分支分离,而且整个工作区被该版本覆盖,此时分支处于未命名状态,可以用当前状态创建一个新分支,或者切回到另一个已存在分支。

1

$ git checkout (版本号)

使Head指向指定的版本,并且整个工作区被该版本覆盖,此时分支处于未命名状态,可以用当前状态创建一个新分支,或者切回到另一个已存在分支。

4.批量解决冲突

如果合并版本后产生了冲突文件,可以手动修改后再git add,也可以批量解决冲突,选择自己的版本或选择别人的版本

12

$ git checkout --ours . #使用自己的版本,.表示当前目录下所有文件,也可以指定其他目录$ git checkout --theirs . #使用别人的版本

分支

123456

$ git branch #查看分支$ git branch dev #创建分支$ git branch -d dev(分支名) #删除分支$ git branch -f 分支名 (版本号或者相对引用)     #强制将分支指向某个版本$ git branch -u origin/master 分支名(缺省为当前分支) #将分支关联到远程分支,-u等于--set-upstream-to$ git branch -m rename_old rename_new #将本地仓库的rename_old的名称修改为rename_new

合并

1.merge

123

$ git merge dev #将当前分支与dev合并$ git merge --squash dev  #分支的最新commit合并到当前分支的工作区和暂存区,此时commit当前分支就不会有冗余commit了$ git merge --no-ff -m "注释" dev  #不采用快速向前(fast forward)的方式合并分支,如果master在dev之后没有改动,合并相当于直接把master的HEAD指向dev的HEAD,但这样会导致看不出来做过合并

如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-histories进行允许合并。

2.rebase

123

$ git rebase master #将当前分支所作任何修改都当作是从主分支最新commit开始计算合并$ git rebase -i master #可视化的选择当前分支能合并的版本追加到master上,还可以对选择的多个进行排序$ git rebase -i master dev #将dev的分支追加到master上,如果不跟dev,默认是当前分支,同时HEAD指向dev分支

3.cherry-pick

1

$ git cherry-pick (版本1) (版本2) #将当前分支(HEAD)后追加选择的版本,然后分支指向最后一个版本号

思考

主分支master有C1,C2 2个提交,开发分支dev在主分支基础上有C1,C2,C3,C4,C5 5个提交,除了C5是最后结果,前面的提交都是开发中的过程产生的冗余提交,不需要合并到主分支。 假设目前在dev分支

  • 方法一:

12

$ git checkout master #切换主分支$ git cherry-pick C5 #选择dev分支的C5版本

  • 方法二:

123

$ git rebase -i master #以master作为源,同时使用-i参数选择dev分支的C5作为要合并的提交版本(不加-i会使用dev分支的全部提交版本)$ git checkout master$ git merge dev

采用方法二,最后master和dev都指向的是同一个版本,而采用方法一,2个分支指向的节点不一样,虽然都是C5

标签

tag

1

$ git tag v1 版本号

给版本打上标签,以后可以直接通过标签引用,不用再找版本的hash值。如果不指定版本号,默认打在HEAD的指向上。

查找最近的标签

1

$ git describe <ref> #可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)

它输出的结果是这样的:<tag><numCommits>g<hash>。 tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。当 ref 提交记录上有某个标签时,则只输出标签名称。

远程

将本地分支和远程分支关联。如果某人已在远程服务器上添加了分支dev,你想把这个分支down下来,首先你要本地创建一个分支,然后将本地分支与远程地址关联

1

$ git branch -u origin/dev dev

也可直接创建并关联

1

$ git checkout -b dev origin/dev

remote

12345

$ git remote add origin git@github.com:Mcdull0921/HelloGit.git #为本地项目添加一个远程地址$ git remote origin set-url [url]  #修改远端地址$ git remote rm origin       #删除远端地址$ git remote add origin [url]  #添加远端地址$ git remote -v #查远程地址

fetch

git fetch <remote> <place>

123

$ git fetch #相当于是从远程获取所有分支最新到本地,不会自动merge,更新本地全部远程分支指针$ git fetch origin master #将远程仓库的master分支下载到本地,并更新本地远程分支指针origin/master,只更新一个分支$ git merge origin/master #进行合并

也可以用以下指令:

123

$ git fetch origin master:tmp #从远程仓库master分支获取最新,在本地建立tmp分支$ git diff tmp #將當前分支和tmp進行對比$ git merge tmp #合并tmp分支到当前分支

fetch和pull的来源正好相反:

12

$ git fetch origin foo~1:bar #将远程上的foo上一个版本更新到本地,并且让本地分支bar指向这个版本。$ git fetch origin :bar #没有指定远程的源,相当于直接在本地创建一个bar分支

这个并不会更新关联的origin/foo的指向,如果bar分支不存在,则会创建一个bar分支

push

git push <remote> <place>

如果不跟任何参数,把当前分支的指向推送到该分支关联的远程分支,如果没有关联,提示错误;

指定参数,例如git push origin master,把本地的master分支推送到远程仓库origin的master分支,分支名需要一样,用这种方式相当于并不是以当前分支而推送,可指定任意的分支,前提是名字一样;

如果分支名字不同,可用git push origin foo^:master,将任意的版本推送到远程仓库master分支;

如果远程分支不存在,还可以创建新的分支git push origin master:newBranch

1234

$ git push -u origin master #本地项目推送到远程地址的master分支,首次使用加-u,将本地master与远程master关联,以后可不加,-u等于--set-upstream$ git push origin HEAD --force  #先让本地回到某个版本,此命令向远程推送以当前HEAD作为最新版本,会清除掉服务器上HEAD之后的其他版本$ git push origin :branch #没有指定本地源直接写:会删除掉远程分支$ git push origin master:my_remote_new_branch #远端即可创建新的分支my_remote_new_branch

pull

pull就是fetchmerge 2条命令的组合,例如: git pull origin foo 相当于:git fetch origin foo; git merge origin/foo git pull origin bar~1:bugFix 相当于:git fetch origin bar~1:bugFix; git merge bugFix

12

$ git pull origin master #相当于从远程获取最新版本并merge到本地,相当于git fetch加上git merge$ git pull --rebase #相当于git fetch加上git rebase

文本对比diff

对比文件内容,常用显示命令:

  • q ,Q:退出显示
  • H,h:命令帮助(有了这个,其他的都不用看了)
  • y,k:上一行
  • e,j,回车:下一行
  • z,b:上一页
  • f,space:下一页
  • 小键盘的Home,End,PgUp,PgDn,上,下键对应相应的功能。

1

$ git diff <commit1> <commit2> 文件目录D

如果git diff后面只有两个commit号,那么git将输出这两次提交的全部代码差异。如果跟上路径,那么将输出文件目录文件D下所有这两次提交涉及的代码异同。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始
    • git初始化
      • 仓库初始化和提交
        • 查看记录
          • 相对引用
            • 撤销操作
              • 1.reset
              • 2.revert
            • checkout的用法
              • 1.从暂存区恢复到工作区
              • 2.切换分支
              • 3.修改HEAD的指向
              • 4.批量解决冲突
          • 分支
            • 合并
              • 1.merge
              • 2.rebase
              • 3.cherry-pick
            • 思考
            • 标签
              • tag
                • 查找最近的标签
                • 远程
                  • remote
                    • fetch
                      • push
                        • pull
                        • 文本对比diff
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档