admin 管理员组

文章数量: 887021


2023年12月22日发(作者:鼠标点击超链接样式)

Win10下的Git配置和使用

工作流程与代码

1. 第一步,获取代码

– 如果是已在git远程仓库中的代码,则git clone xxx+git branch -a+git

checkout --track origin/develop+git checkout -b feature-login

(origin/feature-login) ,完成克隆代码并从远程分支develop分支检出本地develop分支,并创建(检出远程)feature分支在本地进行功能的开发。

2. (合作开发)每天开始工作前,要做的是把代码从远程仓库中git pull (--rebase)

3. 开发过程(本地) 上次提交过后,这次又写了一些代码,但是写错了想退回去之前的工作空间状态

git reset [版本号] 是回退本地仓库但工作空间不变。 git reset --hard xxx 回退本地仓库并还原工作空间到 次提交过后状态。 git reset --hard [filename/版本号] git checkout [文件名] 退回到 上次暂存区(add)状态 的工作目录。

开发时想查看git状态和信息

git status git log git reflog git blame filename 查看本文件最后一次修改记录

每天干完活之后

git stash , 隐藏当前工作空间的修改 git stash list , 列出stash 记录 git stash -pop 恢复现场并删除一个stash记录。 git stash apply , 恢复现场,但不删除stash记录 git stash drop , 删除一条stash记录

当功能分支开发完毕之后,需要合并到开发分支上并上传代码,同时删除本地和远程的功能分支

//以下两步的作用是保证你本地的feature-login分支的代码为最新,因为有可能你是和别人合作开发的该功 能,如果你刚更新过或者你是一个人在开发则可以省略此操作 git checkout feature-login //切换到本地feature-login分支 git pull --rebase //拉取最新代码 git checkout develop //切换到本地develop分支 git pull --rebase //拉取最新的远程origin/develop分支代码,因为可能已经有人提交了代码 git merge --no-ff feature-login //从本地feature-login分支合并代码,--no-ff为禁止fast-farward模式 git push //推送到远程分支 //代码已经合并完,可以删除本地特性分支和远程特性分支 git branch -d feature-login //删除本地feature-login特性分支 git branch -r -d origin/feature-login //删除远程origin/feature-login特性分支

阶段性开发完成,可以发布release了

镇帖之宝

得到:

然后添加这两个句话添加到末尾 C:WindowsSystem32driversetc 然后到cmd中刷新DNS缓存:ipconfig /flushdns 收工!!

git-bash使用

1. cat echo等都可以用

2. 选中复制,中键黏贴。

1. 更新ssh密钥,指令:ssh-keygen -t rsa -C "",不输入文件名也行一路回车。然后到。然后在ws下的.ssh目录下有公钥.pub和私钥。进入到github上点开设置-ssh和gpg密钥,用记事本打开.pub然后把内容上传title可以随意。bash中键入ssh -T 测试是否成功验证

几个名词的解释:

1. index(staged暂存):暂存区,将工作区的文件通过git add加入git管理体系中。可以通过git status查询暂存区状态

index

2. repository :仓库。github上的一个项目;

3. Fork:叉子。在别人的github页面,点击fork按钮,将别人的仓库复制一份到自己的仓库,此时我们自己的github就有一个一模一样的仓库,但是URL不同。你可以自行修改项目内容而不会影响原始的库,也可以将自己的修改通过合并请求(a pull request)的方式请求原始库的开发者更新你的修改;

4. Clone:克隆。将github中的仓库克隆到自己电脑本地仓库中;

5. Push:推。将本地仓库推送同步到远程github仓库(需要权限)

6. Pull request:将你github仓库的修改同步到代码原始开发者那(fork过来的那个人)

7. fetch:去取来。也就是说当你fork了别人的项目,你可以pull request合并你的代码到作者代码。同样,作者修改了自己的代码你也可以fetch下来同步到自己的本地仓库。

8. branches:分支。

注:如果你没被作者授权为他一些仓库的合作者,你不能push。只能fork过来然后修改完pull request请求作者合并,作者通过请求后就能合并代码。

图文结合:

图文结合

这里的remote泛指远程库,不一定是自己的或别人的。index为暂存区

基本操作

原理图

通用操作

1. git reflog 查询完整log

2. git status 查看文件的修改情况,提交情况。

3. git blame filename 查看文件的最后修改记录,包括修改者,修改时间,修改内容

4. git reflog 显示每一次操作指令。

本地仓库到自己github:

1. github上创建一个远程仓库。

2. git init , 初始化一个目录为工作区,创建本地仓库。

3. git add ./文件名 , 添加文件到工作空间暂存区。

解释

4. git remote add origin(该为主机名,可以自己命名) url , 本地仓库添加一个远程主机并命名。

5. git push <-u>(设置默认远程分支=写的远程分支) origin(远程主机名) 本地分支名<:远程分支名>(不写为同分支名,如不存在则新建) ,将本地仓库分支推送到远程仓库的分支(需要有权限,如果不是自己的github的仓库,则需要别人授权仓库的contributor权限)。此外url可以有多种格式:用户名/远程仓名.git 、git://开头的靠ssh协议、或:用户名/远程仓名.git。 6.1 git

push , 推送当前分支,只有1个远程跟踪分支或有默认主机时使用。当多个用户共同开发的时候,可能你的提交比你的同伴晚,所以你需要先pull下最新版本,然后在本地合并后继续push。 6.2 git branch --set-upstream-to=origin/dev dev , 继续6.1、pull失败时,可能是本地分支dev没有和远程分支建立连接,不知道你从哪个分支pull到哪个分支。

6. git restore , 放弃、撤回、恢复工作区中一些文件的修改。 8.1

git restore --staged , 当你add一些文件到暂存区,你要使用这个指令来从暂存区中移除该文件,然后再使用8的指令来恢复该文件。

获取别人的代码到自己github并本地仓库修改:

1. 在github上fork别人的代码到自己的github上作为仓库。

2. git clone 仓库网址url , 克隆一个一模一样的远程库到本地库。当然不一定要从主机github上克隆。且自动关联主机且默认远程仓库主机名叫origin。使用git clone -o 名字 url 可以修改默认名。

3. 本地到自己github操作见以上。

4. 添加一个远程主机关联(使用原作者url)

5. git fetch origin(远程主机名) master(分支名,不写=所有分支,下同) , 获取原作者一些分支的最新版本。

6. git branch -a(ll) , 查看所有分支。

7. git diff 源分支 目标分支或者git log -p master(本地分支名)..origin(远程主机名)/远程分支名 , 比较本地和一些关联的差别。

8. git merge origin(远程主机名)/远程分支名 , 合并当前本地分支和远程分支。

9. git pull origin(远程主机名) master(远程分支名) :本地分支名 , 相当于

fetch+merge。缺少检查差别的这步。如果远程分支和本地分支一个名字则:本地分支可以省略。

10. git remote -v :查看远程主机名列表

WS未提交当前内容却想进行其他工作事项时。

1. git stash , 隐藏当前工作空间的修改

分支管理

多人协作中,github上存放镜像,其中有master分支是要发布的版本,其余分支是并行的,可以合并到主分支上。各分支是不同开发者从他们的本地仓库分支推上来的。

分支

master branch

一个仓库中可以同时存在多个分支,我们可以基于任何一次提交,新建一个分支,并让之后的提交都沿着新分支流动。

分支流动

HEAD指针,指向当前正在操作的分支的最新的提交点,你所处分支变化了,HEAD就会跟着变化。

.git/HEAD

HEAD

注:分支名指向分支的最新一次提交,HEAD指向当前分支的最新一次提交 ,由于git仓库是使用“链表”的形式管理各个提交的,随意修改链表头的位置,即可回退到其中一个版本上(git reset)。

reset操作

相关指令:

1. git checkout,切换分支、创建并切换分支、等,其实就是移动HEAD的指向。 2.1 git checkout -b name , 创建并切换分支。 2.2 git checkout -b dev

origin/dev , 从远程仓库克隆下来的仓库在本地只有master分支,其他分支需要创建远程分支的本地分支。 2.3 git checkout name , 切换分支。

2. git switch 3.1 git switch -c dev , 也是切换并创建分支,使用switch避免了checkout的两种用途(撤回、切换分支)的混淆

3. git merge name , 合并分支name到当前分支,使用fast forward模式(直接丢弃被合并分支)。 4.1 git merge –no-ff -m “注释” name , 禁用fast

forward合并模式来合并,保留被合并分支。 4.2 如果合并出现冲突,则不会在合并的时候自动提交合并体,而是停下来等用户修改完冲突后提交。可以用git status查看时哪些冲突。冲突的文件中会被类似如下显示文本,手动选择一个然后删去所有文字即可手动合并。

利用分支进行开发的工作流程

分支策略

简单的说就是有一个稳定的master,有一个不稳定的dev,而每个人都有自己的一个独立dev分支取名为自己的名字,然后各自往dev上提交,如果遇到bug了就创建临时分支来debug,有其他的小尝试比如新功能也不要再dev上开发,先额外再创建一个分支在上面开发,在合并到自己的dev上。等dev开发到1.0/2.0版本了,在合并到master上发布。

长期分支

在每次合并新稳定内容到master后,创建一个next或develop分支进行后续的开发。

长期分支开发

特性分支

多个分支同时开发,然后简单的三方合并。

远程分支

你clone下来后,自动生成一个origin的远程主机和分支origin/master。同时本地也生成一个分支叫master,指向同一个提交

远程分支

此后你基于此一直开发,即master一直后移,且别人把新的内容推到远程仓库,但是只要你没和远程仓库交互,这个远程分支就不会移动。

开发过程

通过git fetch指令可以同步远程仓库数据到本地。

fetch之后

推送本地分支

就是push了

分支的衍合

之前的合并是使用三方合并即分支1和分支2及其共同祖节点(也就是分叉点)三者的合并,然后生成1次新的提交。

合并前

合并后

以上是合并的样子,而衍合如下所示。以要进行衍合的分支的最后一次提交为基础生成一系列文件补丁,在基底(衍合目标)最后一次提交上,逐个使用补丁。最后生成一个新的合并。

衍合的结果

如何看懂diff内容

1. git diff , 用于查看staging area 和 working area 的文件差别。

2. git diff refs/remotes/origin/master , 用远程一些分支比较当前工作区

输出格式

例子

表示源文件第1行开始的2行和目标文件第1行开始的4行构成差异小结。然后目标文件3、4行多了2句话。空格开头的白色行是- + 两个文件都有的。- 开头的是源文件有的(已经提交的),+是工作空间中的文件的内容。

配置别名

git的原理

存储结构

blob

git将每个文件存下来。并且通过计算文件的内容SHA-1 哈希值为校验和(40个字节)。如果修改了内容、名字、目录,该值都会变,通过判断校验和是否变了判断

文件是否修改。然后以40个字节的头2个字节为目录名,后38个字节16进制为名字保存文件

tree

tree类似于目录。一个tree可以存储tree和blob对象的记录,每一条记录都含有一个指向blob或子树的SHA-1指针,并附带对象权限、类型、文件名等信息。

对象的存储

如何存储一个blob呢?{blob 文件内容长度0}花括号内容为文件头,后面拼接文件内容行成新内容。然后计算新内容的SHA-1校验和,然后用zlib压缩数据,以SHA-1前2个字节为目录,后38个字节为文件名进行磁盘的写入。所有的git对象都是以这种方式存储的。

综合以上所说:我们知道了Git和所有版本控制软件一样,只能跟踪文本文件(就是代码等)。对于图片、影音,虽然也能进行版本控制,但是只能知道其是否删除和修改,但是修改了哪些内容是不知道的。这类非纯文本(包括word和markdown)是以二进制形式串起来编码的。

参考:


本文标签: 分支 远程 仓库 合并 修改