版本控制系统git

标题git相关及git 标题hub相关

概念

注意所有的版本控制系统,只能跟踪文本文件的改动

首先用git init 来在当前文件夹创建git的数据库,记录版本相关的东西

将整个git分为4个仓库,在数据同步后可以理解为四个相同的文件夹:

工作区:主机上看见的文件夹

暂存区:提交一个版本是个严肃的事,先放暂存区,确认了再提交到更上层

git本地仓库:也就是打游戏的各个存档

git远程仓库:远程版git本地仓库,为了方便联网和多人操作

而多一个分支,表明多了一份git本地仓库,不会影响工作区和暂存区。举个例子:在当前分支工作区有未到暂存区的文件a,暂存区有未到git本地仓库的文件b,新建分支并切换到新分支,用git status查看与在老分支结果一样

一些初始操作:

git init //在当前文件夹建设git数据库,之后对当前文件夹及其子文件夹提交到比工作区更上层的仓库后,再变化工作区相关文件,就能够知道其变化
//添加远程仓库有以下两种方式,添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
git remote add orinin https://github.com/wanggaolang/test.git //https方式添加远程仓库
git remote add orinin git@{server_name,如“github.com”}:wanggaolang/test.git //ssh方式添加远程仓库
git remote set-url orinin {以上两种方式的远程仓库} //以覆盖的放式添加远程仓库orinin,也就是说若orinin有则被覆盖
git remote rm origin //删掉远程仓库

git push -u origin master //在远程仓库创建master分支,并将当前分支git本地仓库上传上去
git push -f //强制让远程关联分支的git远程仓库被本地覆盖
ssh -T git@github.com //测试与github联通性
各个仓库的常规流动

查看前三个仓库间的未提交状况:git status

pull操作

将远程指定分支拉取到本地指定分支上 git pull origin {远程分支名}[:{本地分支名},如果不要就是拉取到本地当前分支]

将与本地当前分支同名的远程分支 拉取到 本地当前分支上(需先关联远程分支,方法见文章末尾) git pull

git pull在初次拉取可能会让确认rsa秘钥的信任,如果要写入shell脚本里跳过手工确认,则需要如此写:

GIT_SSH_COMMAND=“ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no” git pull

push操作 1、将指定分支推送到远程指定分支 git push origin {本地分支名}:{远程分支名}

2、将指定本地分支推送到同名远程分支 git push origin {本地分支名}

3、将本地当前分支 推送到 与远程同名分支上(需先关联远程分支,方法见文章末尾) git push

同样的,推荐使用第2种方式,git push origin <远程同名分支名>

cat .git/config看到本地与远程分支的关联关系

仓库间之间和仓库内部版本的回滚

将git本地仓库的某次提交(commit)做回滚:git reset

仅将该改动回滚到git本地仓库(保留工作区和暂存区):git reset --soft {commit id}

将该改动回滚到git本地仓库和暂存区(保留工作区):git reset {commit id}

git reset {commit id} {file_name} 将指定版本的指定文件回滚到暂存区(保留工作区和本地仓库)

将该改动回滚到git本地仓库、暂存区、工作区:git reset --hard {commit id}

在回退后再查看git log发现退回来后的已看不到先进版本,好比从21世纪坐时光机来到了19世纪,想再回去已经回不去了

git reflog能够解决这个问题,显示所有的版本

将暂存区回滚/覆盖到工作区: git checkout – {文件名,用.表示所有。注意文件名前有空格}

清除当前目录下所有没add的修改:git clean -df [文件] 如果不加路径,则是所有未add文件都被清除

git放弃修改,强制覆盖本地代码

1)git fetch --all

2)git reset --hard origin/master

3)git pull

git clean去除未追踪的文件

1)git clean -nxdf(查看要删除的文件及目录,确认无误后再使用下面的命令进行删除)

2)git clean -xdf

可以配合git checkout .清除所有改动

回滚云端仓库

撤销某次commit:git revert {参数,详见下方} 思想是新增一个commit,改动是源commit的反向改动

  • commit 9f90458ccb347581df6f83bd3ee7dfdcb33e97d6
    |\ Merge: 460f055 2f1241f
    | | Author: Your Name you@example.com
    | | Date: Mon Sep 13 20:53:31 2021 +0800
    | |
    | | Merge branch ‘b_revert_branch’
    | |
    | * commit 2f1241fa75e6aef10c59a03ac008eea432386df8 (b_revert_branch)
    | | Author: Your Name you@example.com
    | | Date: Mon Sep 13 20:52:57 2021 +0800
    | |
    | | add b_revert
    | |
  • | commit 460f0551004ebcc10e08d4cab84887d2946cb7da
    |/ Author: Your Name you@example.com
    | Date: Mon Sep 13 20:53:19 2021 +0800
    |
    | add a_revert
    |
  • commit 886081a9659163de8b94ac539fb24e001416ea23
    | Author: Your Name you@example.com
    | Date: Fri Mar 26 17:34:33 2021 +0800
    |
    | 常规提交
    | add test in ab

revert针对两类commit分开讨论:普通commit和merge commit

普通commit的撤销:git revert {commitId}
如git revert 460f0551004ebcc10e08d4cab84887d2946cb7da 其实就是相对向下的commitId(886081a9659163de8b94ac539fb24e001416ea23),撤销了a_revert文件

merge commit的撤销:git revert {commitId} -m {1或2}
撤销相对下方的commitID的改变,但是merge commit有两个"下方commitID",所以需要用-m指定第几个(见9f90458ccb347581df6f83bd3ee7dfdcb33e97d6下的Merge有两个commitId,左1右2)
如 git revert 9f90458ccb347581df6f83bd3ee7dfdcb33e97d6 -m 1 ,就撤销了460f0551004ebcc10e08d4cab84887d2946cb7da到9f90458ccb347581df6f83bd3ee7dfdcb33e97d6之间的内容
git rm XXX 删掉暂存区中的文件,如果本地(工作区)文件未删除也会一并被删掉

如何查看git status的提示

『Changes to be committed』change需要提交的,也就是改变记录存在暂存区中的

『Changes not staged for commit』更改没有步入(staged)提交(准备)的,也就是改变记录存在工作区的stage形容了从工作区步入暂存区

git clone git@server-name:path/repo-name.git克隆到本地,会将所有文件保存在仓库名文件夹中,也就是不用自己创建一个文件夹在clone,在主目录clone就行了。这种clone会把git数据库克隆过来,所以会让本地有所有远程分支
git fetch todo

在使用git提交代码的时,git commit -m “内容”

如果内容编写错误:使用git commit --amend 对上次提交的内容进行修改

如果需要用编辑器进行多行编辑commit message:git commit -a

分支相关

分支的作用:1)多人同时操作同一仓库,为了防止混乱,要让每个人有自己的git本地仓库,而多一个分支就多一个git本地仓库。 2)当有一个新需求需要更改代码,而更改过程中可能要回到没改变之前的样子用于调试修复其他功能模块。这时候可以将新功能commit到新分支,再切换回来修复其他功能模块。当新需求完成后在master分支merge该分支,处理冲突并commit就行了。这时在master分支只会多出一个merge的log版本。

如果在XXX分支中进行了改变并commit,切回主分支,不做任何改动就merge,虽然两者内容冲突,但时间线上XXX更新,所以会将XXX的改变改过来,也就是master指针指向XXX

如果在XXX改了后切到master分支又改东西,即使两者都是添加新东西,在merge时,也会产生冲突,因为产生了两个时间线

创建分支git branch {新分支名} 新分支复刻当前分支,并且HEAD指针,也就是当前工作区指向的分支仍为原来分支

切换分支git checkout {分支名}

创建并切入新分支git checkout -b {分支名}

创建分支并与远程分支关联git checkout -b {新建分支} origin/{远程分支} 这时新建分支内容就是关联分支内容

​ 新建分支并与当前分支某个commit关联git checkout -b {新分支名} {commit_id}

已创建分支关联远程分支:git branch --set-upstream-to=origin/{分支名} {分支名}

删除分支git branch -d {要删分支}

查看所以分支git branch -a 不加- a为显示本地分支

添加远程分支:git push origin {本地分支}:{远程分支}

删除远程分支:git push origin {空格}:{远程分支} or git push origin --delete {远程分支}

在当前分支合并(并入)指定分支:git merge {指定分支名} 如果有冲突需要解决冲突再add,commit。若无冲突会自动commit

将另一分支某次提交合并到本分支:git cherry-pick {commitHash},注意这只会合并这次提交的相关改变,如某个值和本分支不一样,但是并非这次提交才不一样,合并不会让本分支冲突。

可以用git log --graph看到分支合并图

跨分支拷贝合并指定文件

复制目标支合文件到当前分支:git checkout {文件所在分支} – {文件名}
合并目标支合文件到当前分支:git checkout --patch {目标分支} {文件名}
杂项

git diff [多个参数] git diff相关

​ 概念:git diff a b意味着以a为基准,相较于a来说,b增加了啥,减少了啥

​ git diff b等效于git diff b {当前状态}

​ 只显示不同文件名:–name-only

​ 比较工作区与暂存区区别:git diff

​ 比较本暂存区和本地仓库区别:git diff --cached

​ 比较俩commit区别:git diff {第1个commit的sha值} {第2个commit的sha值}

​ 比较本地git仓库和远端区别:git diff origin

​ 解决git diff中文文件名乱码问题:

$ git config --global core.quotepath false # 显示 status 编码
$ git config --global gui.encoding utf-8 # 图形界面编码
$ git config --global i18n.commit.encoding utf-8 # 提交信息编码
$ git config --global i18n.logoutputencoding utf-8 # 输出 log 编码

-----其他-----
git config --add core.filemode false #忽略文件权限的改变
git config —global core.editor vim #git默认编辑器更改为vim

git config --global --unset https.https://github.com.proxy #设置git代理
git config --global --unset http.https://github.com.proxy
暂存git stash

常规:git stash push -m “my_stash”

将包括未追踪文件一同暂存进栈:git stash push -u

To apply a stash and remove it from the stash stack, type:git stash pop stash@{n}

To apply a stash and keep it in the stash stack, type:git stash apply stash@{n}

删除:git stash drop stash@{1}

如果git stash push后不小心drop掉了,恢复方法:

git fsck --unreachable 尽量看commit的sha
git show sha 看哪个是被删的那个
git stash apply sha
查看某次push的文件/具体内容:git stash show [-p,显示内容] stash@{0}
经典操作

正在新分支写feature发现主线有bug:

1)git stash push保存;2)切换到主线并新建分支;3)修复bug并commit;4)在主线和新分支分别git cherry-pick {commit},如果没有冲突自动commit了;5)git stash apply恢复写到一半的feature;6)删除bug分支

push后发现需要修改另外的一个文件a:

1)废弃掉这次push;2)修改文件a;3)git add a;4)git commit ----amend;(如果遇到编辑器是nano,则git config --global core.editor “vim”)

git .gitignore相关

对于在.gitignore文件中新增项,分为2类:1)对于之前从未trace的文件,直接修改.gitignore,就会生效,然后add .gitignore文件并提交;2)对于已经trace的文件(即已经git add的文件),需要1)修改.gitignore文件;2)git rm -rf --cached . 3)git add . 4)git commit 之后该文件的更改忽略才会生效

忽略当前git仓库下某些文件夹:在git仓库根目录的.gitignore文件写入这些文件夹名字,注意是以git仓库当前.gitignore目录作为基础目录的相对路径,最好不要带./,如当前文件夹下tmp_file就直接写入.gitignore中为tmp_file

修改当前仓库用户和邮箱:

vim .git/config 修改为形如:

[user]
name = songhongshan
email = songhongshan@xx.com
git commit --amend --reset-author

解决工作区相对暂存区有更改情况下git stash apply失败问题:

1)git add -u . 2)git stash apply s 3)git reset

更改本地分支名:git branch -m oldName newName

更改某次提交的message:1) git rebase -i {该次提交之前的一次提交} 2)在该提交前改pick为r并保存退出 3)自动跳到另一个vim,更改message并保存退出

融合几次相连commit:1) git rebase -i {其中最旧提交之前的一次提交} 2)在最旧前改pick为r,其他都改pick为s,保存退出 3)自动跳到另一个vim,更改message并保存退出

将不关联且有提交的远程代码库关联本地代码库并做合并&push

1)关联远程代码库:git remote set-url --add origin ssh:XXX 检查是否添加成功:cat .git/config,查看[remote “origin”]项

2)拉取远程代码库:git pull --allow-unrelated-histories 对于冲突部分做合并&commit

3)git push

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值