作废 可以以计算机基础下的git文章进行拓展,这篇文章作废掉
学习网址 这可能是学习git操作最好的网址了 ——— learngit
tips 一个本地仓库可以对应多个远端仓库 git remote add origin xxx.git // 将本地仓库与远端建立联系 origin是仓库别名 可以自定义 git remote add origin1 xxx.git // 将本地仓库与另一个远端建立联系 如果都使用origin push将一起推送至两个仓库 如果增加-u指令 则使用 git push 默认推送到设置的仓库,不使用默认则是 git push origin master
git图示
git命令简单介绍,后期会补全 git add 可将该文件添加到暂存区。
1 git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录:
添加当前目录下的所有文件到暂存区:
git add -u <==> git add –update提交所有被删除和修改的文件到数据暂存区
git add .提交所有修改的和新建的数据暂存区
git add -A <==>git add –all提交所有被删除、被替换、被修改和新增的文件到数据暂存区
撤销git add 撤销上次add
1 git checkout . 撤销add操作,不可恢复
单独撤销某个文件 对应vscode中的取消暂存文件
上面的这个命令是一个简写,实际上reset命令的完整写法如下:
1 git reset --mixed HEAD a.txt
其中,mixed是一个模式(mode)参数,如果reset省略这个选项的话默认是mixed模式;HEAD指定了一个历史提交的 hash 值;a.txt指定了一个或者多个文件。
该命令的自然语言描述是:不改变work dir中的任何数据,将stage区域中的a.txt文件还原成HEAD指向的commit history中的样子 。就相当于把对a.txt的修改从stage区撤销,但依然保存在work dir中,变为unstage的状态。
描述的不咋滴
git commit 将暂存区内容添加到仓库中
再简单提一些常见场景, 比如说commit完之后,突然发现一些错别字需要修改,又不想为改几个错别字而新开一个commit到history区,那么就可以使用下面这个命令:
这样就是把错别字的修改和之前的那个commit中的修改合并,作为一个commit提交到history区。
工作区命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + git clone 从远端仓库拉取代码 - git init 初始化 - git remote 远端建立连接 - git pull 拉取远端代码,并与本地合并 git log 查看提交记录 按空格持续加载 Q退出 git log 可以显示所有提交过的版本信息,不包括已经被删除的 commit 记录和 reset 的操作 git reflog 可以查看**本地所有**的所有操作记录(包括分支、包括已经被删除的 commit 记录和 reset 的操作),适合找回 git config git config --global --list 查看全局的git配置 git config --global user.name xxxx 设置全局user name git config --global user.email xx@xx 设置全局user.email 1、仓库级别 local 【优先级最高】 2、用户级别 global【优先级次之】 3、系统级别 system【优先级最低】 git status 工作区 暂存区 远端是否需要拉取等信息 git restore 指令使得在工作空间但是不在暂存区的文件撤销更改 git restore --staged 的作用是将暂存区(add)的文件从暂存区撤出,但不会撤销修改 git commit -m "msg" 暂存区提交到本地仓库
git push git push 命令用于从将本地的分支版本上传到远程并合并。
命令格式如下:远程分支如果不存在,则会创建一个分支
1 git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
1 git push <远程主机名> <本地分支名>
如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
1 git push -u origin master
当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项
实例演示
以下命令将本地的 master 分支推送到 origin 主机的 master 分支。
相等于:
1 git push origin master:master
如果本地版本与远程版本有差异,但又要强制推送可以使用 –force 参数:
1 git push --force origin master
删除主机的分支可以使用 –delete 参数,以下命令表示删除 origin 主机的 master 分支:
1 git push origin --delete master
略本地分支名,也可以删除指定的远程分支
Git fetch 简单的来说 git pull = git fetch + git merge
git fetch 命令:
1 git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地
如果只想取回特定分支的更新,可以指定分支名:
1 git fetch <远程主机名> <分支名> //注意之间有空格
最常见的命令如取回origin 主机的master 分支:
取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
可以看到返回的信息包括更新的文件名,更新的作者和时间,以及更新的代码(19行红色[删除]和绿色[新增]部分)。我们可以通过这些信息来判断是否产生冲突,以确定是否将更新merge到当前分支。
代码合并示例
1 2 3 4 5 6 7 8 9 10 11 ## 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支; git fetch origin master:temp ## 比较本地代码与刚刚从远程下载下来的代码的区别; git diff temp ## 合并temp分支到本地的master分支; git merge temp ## 如果不想保留temp分支,删除; git branch -D temp
stage暂存区命令
git stash stash命令可用于临时保存和回复修改,可跨分支 。
*注:在未add之前才能执行stash!!!!*
git stash [save message] 保存,save为可选项,message为本次保存的注释
git stash list 所有保存的记录列表
git stash pop stash@{num} 恢复,num是可选项,通过git stash list可查看具体值。只能恢复一次
git stash apply stash@{num} 恢复,num是可选项,通过git stash list可查看具体值。可回复多次
git stash drop stash@{num} 删除某个保存,num是可选项,通过git stash list可查看具体值
git stash clear 删除所有保存
master命令 1 git reset --hard commitID 回退版本 相当于删除中间的版本
Git diff命令的四种用法 git diff 比较「暂存区」与「工作区」之间的差异。
git diff commitID 比较「给定提交 ID」与「工作区」的差异。
git diff --cached commitID 比较「暂存区」与「给定提交 ID」的差异
git diff commit1 commit2 比较指定的两次提交 「commit1」与 「commit2」的差异
选项 --stat 显示有多少行发生变化,简洁的展示差异
git reset git reset 通过把分支记录回退几个提交记录来实现撤销改动
git reset HEAD~1 回退到上次提交(撤销commit),但是文件修改后的内容还是存在于工作区的
远程仓库做出的修改并没有回退哦,要记住
此时通过git log和 git reflog对比就能看出两条命令的明显区别了
Git Revert 虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的!revert 之后就可以把你的更改推送到远程仓库与别人分享啦 。
git revert HEAD相当于相当于把上次提交的内容还原覆盖到工作区中,提交记录会增加一个,而不是减少,详细见下一节的示意
reset 和 revert对比 初始状态,切记HEAD~1和HEAD 不能混用,有意想不到的结果
git reset HEAD~1
git revert HEAD
分支命令 git branch 一般用于分支的操作,比如创建分支,查看分支等等,
git branch 不带参数:列出本地已经存在的分支,并且在当前分支的前面用”*”标记
git branch -r 查看远程版本库分支列表
git branch -a 查看所有分支列表,包括本地和远程
git branch dev 创建名为dev的分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支
git branch -d dev 删除dev分支,如果在分支中有一些未merge的提交,那么会删除分支失败
git branch -D dev:强制删除dev分支
git branch -vv 可以查看本地分支对应的远程分支
git branch -m oldName newName 给分支重命名
git branch -f main HEAD~3 强制修改分支位置 向上移动3个位置
git branch -f main commitID 强制修改分支位置 到指定commit
Git checkout git checkout master 将分支切换到master
git checkout -b master 如果分支存在则只切换分支,若不存在则创建并切换到master分支
在这里只介绍分支相关的命令
Git 合并分支的两种方式
我们在切换分支,和新建分支的时候,有没有想过,这些操作操作背后的工作原理是怎样的呢?最大的功臣就是.git目录下的HEAD引用,下面有对HEAD的详细解释
Git rebase 第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
这个用图示比较清晰
Git flow 两种常见的模型
git HEAD 可以把HEAD理解成一个指针,HEAD指针通常会指向一个分支,如下图所示
HEAD–>master–>commitID,通常情况下,HEAD会一直跟随着当前分支,并指向分支,而分支则指向当前最新的commit
还有一种 detached HEAD的状态,使用git checkout C3即可以把HEAD指针指向C3
还有一种相对引用的方式,git checkout main^*3 或者 git checkout main^^^ 或者 git checkout main~3 或者使用 git checkout HEAD^^^,这几种方法都是向父节点方向移动
如果此时进行commit,git的返回信息会提示我们,You are in ‘detached HEAD’ state.(你现在处于’分离头’状态)。然后会从C3节点出现一个新的节点,HEAD会指向新的节点,可以简单的理解为匿名分支(图和上边不一样,仅做示意)
我们现在有两个选择,如下:
丢弃这个匿名分支
直接检出到任何一个别的分支,就相当于放弃了这些提交
保留这个匿名分支
创建一个名为newtest的分支来保存这些提交
git branch newtest c7 这种方式HEAD并未指向newtest,而是指向了C7,仍是指针分离状态
git checkout -b newtest HEAD指向了newtest,newtest指向了C7
与现存分支,参考分支命令章节
git checkout git checkout命令用于切换分支或恢复工作树文件,也可以指定HEAD指针的位置
除了分支命令中介绍的使用方法,还可以进行HEAD操作,详细见上一小节