社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

为了前端的深度-git的命令行

lionel爱学习 • 6 年前 • 198 次点击  
阅读 13

为了前端的深度-git的命令行

源起

2018年末,我面试了五六家大大小小的公司,其中小公司过了没去,两家大公司的都失败了。在面360和拼多多的时候,因为我感觉自己面对不好,所以我在结束的时候希望面试官可以给我一个评价,意料之中的是,他们都说:你的知识面挺广,但深度不够。反思了自己在2018年的学习历程,买了十几本书,3个视频,4本掘金小册,阅读各种群的群友分享的技术文档,但都是看过就忘,似乎都是在假装努力。就此,在新的一年里,本人痛定思过,想要做一个既有输入又有输出的猿,从某些小的方面入手,认真研究,争取做到获得面试官这样的评价:某些方面很熟练,但知识面太窄。

暂时想了三个主题:git的熟练运用;webpack热更新是如何实现的;前端优化。

包括2018年的我在问,git的命令行有那么重要吗,我sourcetree玩的很6,而且软件还汉化了,推送、拉取、合并,按钮哗哗的点。

是的,对于日常,git确实不用太过深入,冲突的时候把自己的文件删掉再拉下来就行了。但对于面试官来说,问了一句你了解 git rebase 吗,emm...没听过,我一般不用命令行模式。这时候会很尬尴。不多说了,下面开始。

注:文中如有任何错误,请各位批评指正!

问答形式

Q1:我只想将修改过的文件加入暂存区,不想增加新建的。

git add -a

Q2:我刚刚commit了一个错误的文件,现在改正了,我想悄无声息的更改,以免push上去被别人笑话

先修改,然后 git commit --amend

Q2:如何查看有多少分支,当前处于哪个位置

本地仓库 git branch , 当前分支的前面会有一个*号标注

本地仓库和远端分支引用一起, 添加-a参数

Q3:如何删除分支

确保当前分支不是要删除的那个,git branch -D

Q4:要先创建分支再切换过去,太麻烦咯

git checkout -b <name>,一体化操作,一步到位。

Q5:我改乱了工作区某个文件的内容,想直接丢弃工作区的修改,文件内容太多,记不住了

git checkout -- file

Q6:我不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改

第一步:用命令git reset HEAD <file>

第二步:用命令git checkout -- <file>

merge

git merge <name> 省略了主体是当前的head

merge 前要保证暂存区内有待commit的内容,工作区有没提交的内容没有推送,不是必须的,但是保持干净吧。

merge会创建一个新的commit对象

merge冲突的流程来演示下:(仅本地master和分支模拟)

新建一个文件夹learngit --> git init --> 新建文件a.md --> a.md里写上一行,“原始文件”--> git add a.md --> git commit -m "origin" -->新建分支 git checkout -b branch1 --> 修改文件内容为“张三修改” --> 加入暂存区 git add a.md --> 提交 git commit -m "zhangsan" --> 返回主线,git checkout master --> 新建分支 git checkout -b branch2 --> 修改文件内容为“我修改” --> 加入暂存区 git add a.md --> 提交 git commit -m "me" --> 现在开始合并 git merge branch2,现在就遇到我们喜闻乐见的冲突问题了,如下图:

第一图

这个时候不要着急,看下我们的文件:

第二图

我的编辑器根据git给加的符号来生成更友好的界面,我这里点采用当前更改,当然直接删除符号一样可以 --> 这个时候要再添加一次 git add a.md --> git commit -m "fix merge conflict" -->最后push到线上即可

rebase

我理解的rebase为调整commit信息,包括调整链式指向和删除commit信息等。例如有如下的commit信息并且当前处于branch分支

       E - F - G *branch
     /
A - B - C - D master
复制代码

当我们执行:git rebase master 命令后,commit信息将会变成:

               E' - F' - G' *branch
             /
A - B - C - D master
复制代码

最后执行 git branch -f master branch,commit就变成了:

               E' - F' - G' *branch master
             /
A - B - C - D
复制代码

在我的理解里,其实这里面省略了一个参数,git rebase A B,就是把B(B和它之前的提交)指向A,就像下面的第二种情况一样

2.在初始化的结构中,执行 git rebase branch master,commit 信息会变成:

       E - F - G branch - C' - D' *master
     /
A - B - C - D
复制代码

即把 D 和 C 整体指向 branch。

3.在初始化的结构中, git merge maste,commit信息会变成:

       E - F   -   G 
     /               \
A - B - C - D master - H *branch
复制代码

rebase 与 merge相比,更加线性,而且merge会增加一个新的节点。

4.rebase还可以进入交互模式,比如在初始化的结构中,使用git rebase -i branch~3,就进入了交互模式,删除 E 和 F 两个 commit ,执行 git rebase --continue,commit 信息就会变成:

               G' *branch master
             /
A - B - C - D
复制代码

git速查表

最后整理下,以下内容全部来自Git常用命令速查表(收藏大全

名词

master: 默认开发分支 origin:默认远程版本库 Index/Stage:暂存区 Workspace:工作区 Repository:仓库区(或本地仓库) Remote:远程仓库

一、新建代码库

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

二、配置

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

git config --list  # 显示当前的Git配置
git config -e [--global]  # 显示Git配置文件
git config [--global] user.name "[name]"  # 设置提交代码时的用户名
git config [--global] user.email "[email address]"  # 设置提交代码时的用户邮箱
复制代码

三、增加/删除/修改文件

git add [file1] [file2] ...  # 添加指定文件到暂存区
git add [dir]  # 添加指定目录到暂存区,包括子目录
git add .  # 添加当前目录的所有文件到暂存区
git add -p  # 添加每个变化前,都会要求确认,对于同一个文件的多处变化,可以实现分次提交
git rm [file1] [file2] ...  # 删除工作区文件,并且将这次删除放入暂存区
git rm --cached [file]  # 停止追踪指定文件,但该文件会保留在工作区
git mv [file-originname] [file-newname]  # 改名文件,并且将这个改名放入暂存区
复制代码

四、代码提交

git commit -m [message]  # 提交暂存区到本地仓库
git commit [file1] [file2] ... -m [message]  # 提交暂存区指定文件到本地仓库
git commit -a  # 提交工作区自上次commit之后的变化,直接到本地仓库
git commit -v  # 提交时显示所有diff信息
git commit --amend -m [message]  # 使用一次新的commit,替代上一次提交,如果代码没有任何变化,则用来改写上一次commit的提交信息
git commit --amend [file1] [file2] ...  # 重做上一次commit,并包括指定文件的新变化
复制代码

五、分支




    
git branch  # 显示所有本地分支
git branch -r  # 列出所有远程分支
git branch -a  # 列出所有本地分支和远程分支
git branch [branch-name]  # 新建一个分支,但head依然停留在当前分支
git branch --track [branch] [remote-branch]  # 新建一个分支,与指定的远程分支建立追踪关系
git branch -d [branch-name]  # 删除指定分支
git checkout -b [branch-name] # 新建一个分支,并切换head到该分支
git checkout [branch-name]  # 切换head到指定分支,并更新工作区
git checkout -  # 切换到上一个分支
git branch --set-upstream [branch] [remote-branch] # 建立追踪关系,在现有分支与指定的远程分支之间
git merge [branch]  # 合并指定分支到当前分支
git rebase <branch>  # 衍合指定分支到当前分支
git cherry-pick [commit]  # 选择一个commit,合并进当前分支
复制代码

六、标签

git tag  # 列出所有本地标签
git tag <tagname>  # 基于最新提交创建标签
git tag -d <tagname>  # 删除标签
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] # 新建一个分支,指向某个tag
复制代码

七、查看信息

git status  # 查看当前工作区状态(与暂存区对比,增加删除或修改)
git log  # 显示当前分支的版本历史
git log --stat  # 显示commit历史,以及每次commit发生变更的文件
git log -S [keyword]  # 根据关键字搜索提交历史
git log [tag] HEAD --pretty=format:%s  # 显示某个commit之后的变动,每个commit占据一行。我记得--pretty=online也行
git log -p [file]  # 显示指定文件相关的每一个diff
git log -5 --pretty --oneline  # 显示过去5次提交
git shortlog -sn  # 显示所有提交过的用户,按提交次数排序
git blame [file]  # 显示指定文件是什么人在什么时间修改过,这个blame很生动形象
git diff  # 显示暂存区和工作区的差异
git diff --cached [file]  # 显示暂存区和上一个commit的差异
git diff HEAD  # 显示工作区与当前分支最新commit之间的差异
git diff [first-branch]...[second-branch]  # 显示两次提交之间的差异
git diff --shortstat "@{0 day agp}"  # 显示今天你写了多少航代码
git show [commit]  # 显示某次提交的元数据和内容变化
git show --name-only [commit]  # 显示某次提交发生变化的文件
git show [commit]:[filename]  # 显示某次提交时,某个文件的内容
git reflog  # 显示当前分支的最近几次提交
复制代码

八、远程操作

git fetch [remote]  # 下载远程仓库的所有变动,注意这个时候是不会修改本地文件的
git pull [remote] [branch]  # 拉取远程仓库的变化,并与本地分支合并
git remote -v  # 显示所有远程仓库
git remote show [remote]  # 显示某个远程仓库的信息
git remote add [shortname] [url]  # 增加一个新的远程仓库,并命名
git push [remote] [branch]  # 上传本地指定分支到远程仓库
git push [remote] --force  # 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --all  # 推送所有分支到远程仓库
git push <remote> :<branch/tag-name>  # 删除远程分支或标签
git push --tags  # 上传所有标签
复制代码

九、撤销

git reset --hrad HEAD  # 撤销工作目录中所有未提交文件的修改内容
git checkout HEAD <file>  # 撤销指定的未提交文件的修改内容
git revert <commit>  # 撤销指定的提交
git log --before="1 days"   # 退回到之前1天的版本
git checkout [file]  # 恢复暂存区的指定文件到工作区
git checkout [commit] [file]  # 恢复某个commit的指定文件到暂存区和工作区
git checkout .  # 恢复暂存区的所有文件到工作区
git reset [file]  # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset --hard  # 重置暂存区与工作区,与上一次commit保持一致
git reset [commit]  # 重置当前分支的指针未指定commit,同时重置暂存区,但工作区不变
git reset --hard [commit]  # 重置当前分支的HEAD未指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --keep [commit]  # 重置当前HEAD未指定commit,但保持暂存区和工作区不变
复制代码

零散记录

git merge <master> 把分支合并到主线 ,例如想合并到主线,要把节点切到主线,然后 git merge newBranch

git rebase 同样是合并分支,更加线性

在分支上先 git rebase master,然后再 git rebase newBranch

cat.git/HEAD -- 查看head指向 与 git symbolic-ref HEAD

相对引用:使用 ^ 向上移动 1 个提交记录,使用 ~ 向上移动多个提交记录,如 ~3

用法一般是:git checkout newBranch^git checkout newBranch~4

git cherry-pick <提交号>,把分支提交到指定位置下 例如 git cherry-pick C2 C4 , 就是把C2 C4节点传到master

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

git rebase -igit cherry-pick

提交技巧 先 git rebase -i 将重新排序,然后 git commit --amend 小修改,然后用 git rebase -i 重新排序

git tag v1 C1 给C1加上v1的标签

git rebase master branch 其实就是把branch指向master

git cherry-pick branch1 branch2 就是把branch2->branch1->head

本文参考

和我一起嚼烂Git

游戏闯关学git

Git教程--廖雪峰

Git常用命令速查表(收藏大全)


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/1pfbi5avTm
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/27644
 
198 次点击