==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
前言:
相信很多还没有工作的同学,对于git的用法还普遍停留在git clone,git push,git pull这些命令,并且用的还不深,接下来,将我在工作中常用到的git命令,分享给大家~
场景一(git push):
小白:嘿~,小黑,最近我遇到了点问题,对git push有点疑惑,可以请教一下你吗?
小黑:嗯,问吧,没有我不知道的。
小白:嘿嘿,果然是大神。是这样的,我在本地创建了一个dev分支(git checkout -b dev),
但是如何在远程也创建一个分支呢?是不是要在页面上点新建branch?
小黑:哈?这么简单的问题还要来麻烦我,我还以为遇到了什么有挑战的问题呢。
小白:哈哈,你是大神当然简单拉,你就指点指点我嘛~
小黑:那好吧,我就给你这个小白好好讲一下。首先,创建本地分支你用的命令是对的,然后你的想法居然是如何在远程创建一个分支?你为什么不想想怎么把当前这个分支直接push上去呢?是不是没想到,还有这个骚操作,哈哈。没错,你在本地push的时候,如果远程没有该分支,会自动创建该分支,若有的话,则会更新该分支。这下子懂了吧。
小白:哇哦,原来这么简单,懂了懂了,大神厉害!那,如果删除远程的分支呢?
小黑:嘿嘿,告诉你一个简单的办法。
//创建一个本地test分支
git checkout -b test
//将test分支推到远程
git push origin test
//删除远程test分支
git push origin :test
其原理就是将一个空的分支推到test,这就相当于删除了该分支,哈哈。
小白:哈哈,果然是骚操作。那我还有个问题,如果我发现刚才push的代码有问题,如何补救呢?
小黑:这个问题问得好,其实这种操作还是会遇到的。当遇到这种情况的时候,先把本地的代码回退到上一个commit,然后强推上去,覆盖远程的commit。
//回退到上一个commit,注意这里的pre-commit只是一个代号,不是命令哈,使用git log 拿到上一个commit号
git reset --hard pre-commit
//强推该版本的代码上去
git push origin test --force
小白:哇,厉害,嘿嘿,大神,今天就先到这里,这个命令已经够我日常开发用啦。
场景二(git fetch):
小白:嗨,小黑我又来了,哈哈。
小黑:(翻白眼)今天又想问啥呀?
小白:哈哈,被你发现了。就是,最近开发的时候,使用git branch -r ,看到有A、B、C三个分支,但是呢,实际上C已经被其它同事删除了,我还傻乎乎的以为C还在呢。
小黑:哈哈,那你是不知道git fetch有一个参数,就是为了解决这种问题的吧,来我教你用。
//使用这个-p参数后,从远程拉取分支回来后,还会自动帮你删掉远程已经被删除的分支,这样,当你
//用git branch -r再看的时候就发现没有这个分支了
git fetch origin -p
小白:嘿嘿,哈哈,谢谢大神~
场景三(git checkout):
小白:大神!还是我!
小黑:我去,又是你,交钱!
小白:嘿嘿,哈哈,咱两的交情谈钱伤感情。快快,我又有问题想问你了。
小黑:(翻白眼)切,问吧,小样。
小白:就是啊,有时候开发的时候,写着写着,发现写错了,但是已经写了一大片,我每次都用git status,找出我改过的文件,然后一行行的还原。。。我快要崩溃了。
小黑:说你是小白,你还真是小白,这么愚蠢的办法(我刚上班的时候就是。。。)你都想得出来,真的看不下去了!看着,
//把所有更改都还原了,没错,checkout后面就是一个点
git checkout .
//只想还原某个文件的所有操作
git status
git checkout filename
小白:好厉害啊,我怎么没想到,真的是太方便了!咦,那我如果我已经git add了呢?
小黑:嗯,这个就稍微多了一个步骤
//一次性还原所有git add过的文件
git reset HEAD
//再一次性还原所有操作过的文件
git checkout .
//如果只想还原某个git add过的文件
git reset HEAD filename
//再还原这个文件的操作
git checkout filename
小白:那那那,如果已经git commit了呢?
小黑:那只能祭出终极大招了!
//找到上一个版本的commit号
git log
//回退到那个版本
git reset --hard pre-commit
//如果你不想当什么都没发生过,还有一种比较温柔的方法
git reset HEAD~1
//这个时候就相当于撤销了,git commit和git add
这样就像什么事情都没发生过一样,嘿嘿。
小白:哇,好厉害,这样我已经就不怕乱操作了,哈哈,一切都可以还原。
时间问题,我把剩余总结的一起贴出来了。
git remote 只显示远程git名字
git remote -v 查看远程git详细信息
git remote add remote_name remote_git_addr 添加远程git地址
git remove rm remote_name 删除远程git地址
git remote rename remote_name new_name 更改名字
git log 默认分页显示
git log -[length] 指定显示条数
git log -p 显示详细信息
git log --oneline 每一条commit只显示一行
操作和git log一样,不同的是,git reflog可以查看所有分支的所有操作记录,包括删除的的commit记录。
git branch 显示本地的分支
git branch -r 显示远程分支
git branch -a 显示本地和远程的分支
git fetch git merge = git pull
git fetch的优点是可以选择性的合并,例如:
a.git fetch origin 远程分支:temp
b.git diff temp //比较本地代码与刚刚从远程下载下来的代码的区别
c.git merge temp
d.git branch -d temp
不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin 本地分支名 如果远程有该分支则更新该分支,否则新建该分支
git push origin :远程分支名 相当于删除远程分支
git push --force origin 本地分支 强制推送,也就是覆盖远程分支的提交
使用场景:当不小心push了错误的代码到远程分支,那么在本地改了之后,可以使用这个命令,覆盖远程分支。
但是!一定要确保此时或者未来数分钟没有人提交代码,否则将会被覆盖掉。这个功能还是要慎用。
git push origin --tags 只有加上这个参数,才会把标签push上去
git status 查看当前状态(修改的文件为红色,使用git add后,变为黄绿色)
git add filename 将指定文件添加到本地git仓库
git add . 将所有修改的文件添加到本地git仓库
git commit -m comment 将add操作提交并且附带注释