| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> git 学习笔记--1206 -> 正文阅读 |
|
[开发工具]git 学习笔记--1206 |
一、Git基础操作
1.获取Git仓库
? ??1> 使用git 从服务器 上clone相关仓库
? ??git clone https://github.com/libgit2/libgit2??
? ??这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个?.git?文件夹, 从远程仓库拉
? ??取下所有数据放入?.git?文件夹,然后从中读取最新版本的文件的拷贝。? ? ??如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:?
? ??2> git支持协议
? ??Git 支持多种数据传输协议。 上面的例子使用的是?https://?协议,不过你也可以使用?git://?协议或者使用
? ??SSH 传输协议,比如?user@server:path/to/repo.git?。??
2.记录每次更新到仓库
? ? 1>?git status用于查看已经暂存和未暂存文件状态
? ??可以通过git status -s或者git status --short 使得查看结果更加紧凑和精简。
? ??git status
? ??git status -v显示跟踪文件变更内容
? ??git status -s显示紧凑内容。
? ??A??README
? ??MM?mmc.c
? ??M?sdio.c
? ?????index.xml
? ??新添加的未跟踪文件前面有????标记,新添加到暂存区中的文件前面有?A?标记,修改过的文件前面有?M?标记。 输
? ? 2>git add 跟踪新文件或者暂存已修改的文件
? ? 使用git add跟踪新的文件
? ? git add filename 添加指定文件名字至仓库
? ? git add . 递归的添加当前目录下所有变更文件与新增文件
? ? git add -A
? ??
? ? 3>?忽略文件跟踪。?
? ??一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以创建一个名为 .gitignore的文件,列出要忽略的文件的模式
? ??$ cat .gitignore
? ??*.[oa]? ? ? ??忽略所有以 .o 或 .a 结尾的文件 ? ??*? *~? ? ? ???忽略所有名字以波浪符(~)结尾的文件,许多文本编辑软件的副本均是以~符号结尾
? ??
? ??文件 .gitignore 的格式规范:
? ??? 所有空行或者以 # 开头的行都会被 Git 忽略。
? ??? 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
? ??? 匹配模式可以以(/)开头防止递归。
? ??? 匹配模式可以以(/)结尾指定目录。
? ??? 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反
? ??所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
? ? # 忽略所有的 .a 文件
? ? *.a
? ? # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
? ? !lib.a
? ? # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
? ? /TODO
? ? # 忽略任何目录下名为 build 的文件夹
? ? build/
? ? # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
? ? doc/*.txt
? ? # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
? ? doc/**/*.pdf
? ??说明:在最简单的情况下,一个仓库可能只根目录下有一个?.gitignore?文件,它递归地应用到整个仓库中。 然而,子目录下也可以有额外的?.gitignore?文件。子目录中的.gitignore文件中的规则只作用于它所在的目录中。
? ? 4>查看已暂存和未暂存的修改内容
? ??git diff?查看已追踪文件未暂存的修改内容
? ??git diff --cached或者git diff --staged用于查看已经暂存(git add操作)的文件修改内容
? ? 说明:git difftool 会调用vimdiff工具查看差异。
? ? 5> 提交更新
? ??git commit -m "description info"提交修改
? ??配置git commit时使用的编辑器
? ??git config --global core.editor vim?
? ? 这样还可以通过git commit命令打开VIM编辑器完成提交。
? ??? ??? ? 6>跳过使用暂存区域
? ??? ??? ??git commit -a
? ??? ??? ??跳过git add 一次性把所有跟踪文件的修改给提交,未跟踪文件的不会提交。
? ??? ??? ? 7>删除跟踪文件 git rm?
? ??? ??? ??要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交,git rm用于完成此操作。
? ??? ??? ? git rm file_name 或者git rm dir_name
? ??git rm用户删除跟踪文件,如果相关修改未提交,可以通过git restore --staged filename把文件给还原过来。
? ??如果已经提交了,则通过git reset --hard commitID来实现回退。
? ??如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项?-f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。
? ??对于未跟踪的文件,执行git add操作变成跟踪文件尚未提交,可以通过git rm filename还原成未跟踪文件。
? ??对于已跟踪的文件,如果变更了内容,无论是否执行了git add操作,需要执行git rm filename --cached实现从仓库删除文件,但是变更后的文件不会被删除,仅仅变成未跟踪状态,还原方法:git restore --staged filename,还原后的文件,依然是包含修改内容的文件;
? ??git rm log/\*.log 使用git 删除log目录下以“.log"结尾的文件,\*是对*号的转义操作;
? ??git rm \*~ 删除以~结尾的文件。
? ??git rm 删除跟踪文件后还原的另一种方法:git checkout HEAD -- filename
??? 8>移动文件 git mv
? ??git mv filename new_filename 移动文件,用于已跟踪文件的rename操作,
? ??git log new_filename只能查看最近一次的修改记录,如果要查看更名之前的修改记录,使用git log --follow?new_filename
2.?查看提交历史?git log?
? ??git log??按时间先后顺序列出所有的提交,最近的更新排在最上面
? ??git log -p?按时间先后顺序列出所有的提交,并显示每次提交所引入的差异,以patch格式显示,-p即 --patch
? ??git log --stat?查看每次提交的简略统计信息
? ??git log --follow /path? 只查看指定目录的修改记录,当文件rename时,可通过此参数追踪rename之前的修改记录
? ??git log -2 只显示最近两次的修改历史
? ??git log -p -2 只显示最近两次的修改patch内容
? ??git log --oneline?标记把每一个提交压缩到了一行中。它默认只显示提交ID和提交信息的第一行
? ??git log --pretty=short
? ??git log --pretty=full
? ??git log --pretty=fuller
? ??git log --pretty=short
? ??git log --pretty=oneline
? ??git log --pretty=format "%h - %an, %ar : %s"
? ??git shortlog把输出按作者名字排序,但你可以传入-n选项来按每个作者提交数量排序
? ??git log --graph
? ??git log --graph --oneline
? ??git log --graph --oneline --decorate
? ??git log --after="2021-11-1" 按照日期过滤
? ??git log --after="2014-7-1" --before="2014-7-4"
? ??git log --committer="hongtao.wang"
? ??git log --author="hongtao.wang" 查看指定author的修改记录
? ??git log -p --author=jincheng.qian?查看指定author的修改记录对应patch信息
? ??git log --author="hongtao.wang\|baojiang.du" 查看两个人的修改记录
? ??git log --merges查看所有merge记录
? ??git log --since=2.weeks
? ??git log -S function_name 搜索指定函数名字
? ??还可以过滤出匹配指定条件的提交。 用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。
? ? 举例:在 Git 源码库中查看指定author 在 2021 年 10 月1日至2021年11月1日, 除了合并提交之外相关修改记录
? ??git log --pretty="%h - %s" --author='baojiang.du' --since="2021-10-01" --before="2021-11-01" --no-merges
3.?Git撤销操作
? ? 1> git commit --amend的使用
? ??有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交,
? ? git add file1 file2
? ??git commit -m "add file1 and file2"? 第一次提交记录
? ? git add forgotten_file
? ? 方案一、git commit --amend -m "add file1, file2 and forgotten_fie" 第二次提交记录
? ? [master 9487070] add file1 file2 and forgotten_file
? ? ?Date: Fri Dec 3 14:31:57 2021 +0800
? ? ?3 files changed, 233 insertions(+)
? ? ?create mode 100644 file1
? ? ?create mode 100644 file2
? ? ?create mode 100644 forgotten_file
? ? 执行上述第二次提交后,之前第一次提交记录便会被第二次提交记录给代替,再次执行git log查询时只能看到最后一次提交记录
? ?方案二、git commit --amend回车确认后,会打开VIM编辑器,让用户输入变更信息,如果再里面增加一条commit log,那么保存退出后,依然会只有一次git提交记录,但是commit信息有两条,参考如下:
commit affc22f816a68c80fbb49cb8a36c4e8aa134f27a (HEAD -> master)
Author: hongtao.wang <hongtao.wang@amlogic.com>
Date:? ?Fri Dec 3 14:29:37 2021 +0800
? ? add file1 and file2
? ??
? ? add file1 file2 and forgotten_file
? ??方案三、git commit --amend回车确认后,会打开VIM编辑器,让用户输入变更信息,如果此时未输入任何信息,直接保存退出,此时依然只会有一条提交记录,但是commit信息只有一条,即第一次提交的记录。
hongtao.wang@fae01:~/work/build/VCS/my_project$ git commit --amend?
[master 2dd8807] add file1 and file2
?Date: Fri Dec 3 14:42:16 2021 +0800
?3 files changed, 233 insertions(+)
?create mode 100644 file1
?create mode 100644 file2
?create mode 100644 forgotten_file
hongtao.wang@fae01:~/work/build/VCS/my_project$ git log
commit 2dd8807bea5163afd6358efe52ea3a786e6942a4 (HEAD -> master)
Author: hongtao.wang <hongtao.wang@amlogic.com>
Date:? ?Fri Dec 3 14:42:16 2021 +0800
? ? add file1 and file2
? ? 2> 取消暂存的文件
? ? git add后取消暂存方法:git reset HEAD filename
? ? git checkout -- filename 对修改后但未暂存的文件的回退,即从git仓库中把修改之前的文件取出来替换当前文件。
? ? 或者执行git checkout filename
? ??注意:务必记得 git checkout -- <file> 是一个危险的命令。 你对本地任何文件修改都会消失——Git会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
? ? 3>恢复提交后的修改(已经执行了git commit但是并未git push)
? ??如果上述方法不行,尝试执行git reset commitID,其中commitID则是前一次的commit ID(并非当前提交后生成的commit ID)
4. 远程仓库使用
? ? 1>查看远程仓库信息
? ? git remote
? ?上述操作会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin ——这是 Git 给克隆的仓库服务器的默认名字。
? ?git remote -v
? ?会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL:
? ??$ git remote -v
? ??origin https://github.com/schacon/ticgit (fetch)
? ??origin https://github.com/schacon/ticgit (push)
? ? 2>添加远程仓库
? ??git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写
? ??git remote add origin?GitHub - paulboone/ticgit: Git based distributed ticketing system, including a command line client and web viewer?
? ??git push origin master? ??
? ? 远程仓库并非一定是网络上的服务器,也可以是本地,下面是本地模拟添加远程仓库的方法
? ? (1) 在指定目录下创建git仓库目录,通过git init --bare --shared初始化仓库
? ? $ mkdir?/mnt/fileroot/hongtao.wang/build/VCS/test
? ? $ cd?/mnt/fileroot/hongtao.wang/build/VCS/test
? ? $ git init --bare --shared
? ? (2) 客户端git仓库的建立,添加文件并提交入库
? ? $ mkdir /mnt/fileroot/hongtao.wang/build/VCS/my_project
? ? $ cd?/mnt/fileroot/hongtao.wang/build/VCS/my_project
? ? $ git init
? ? $ touch file1 file2
? ? $ git add file1 file2
? ? $ git commit -m "add file1 and file2"
? ??????(3)客户端添加远程仓库操作
? ? ?$ cd?/mnt/fileroot/hongtao.wang/build/VCS/my_project
? ? ?$?git remote add origin /mnt/fileroot/hongtao.wang/build/VCS/test/
? ??? ??3>推送到远程仓库
? ?推送本地修改至服务器
? ??? ??? ?$ cd?/mnt/fileroot/hongtao.wang/build/VCS/my_project
? ?$?git push origin master
? ?等待推送完成即可,这时候本地的相关修改和记录均push到服务器上,可以在其他目录执行git clone?/mnt/fileroot/hongtao.wang/build/VCS/test/??克隆包含最新修改的test工程了。
???4>查看某个远程仓库
? ?git remote show <remote> 命令
? ?会列出远程仓库的 URL 与跟踪分支的信息。 这些信息非常有用,它告诉你正处于 master 分支,并且如果运行 git pull, 就会抓取所有的远程引用,然后将远程 master 分支合并到本地 master 分支。 它也会列出拉取到的所有远程引用。
? ?5>远程仓库的重命名与移除
? ?git remote rename 来修改一个远程仓库的简写名。 例如,想要将 pb 重命名为 paul,可以用 git remote rename 这样做:
? ?$ git remote rename pb paul
? ?git remote remove 或 git remote rm :用于删除指定远程仓库的名字。
? ?$ git remote remove paul
? ?$ git remote
? ?origin
? ?说明:一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
5.打标签
像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。 在本节中,你将会学习如何列出已有的标签、 如何创建和删除新的标签、以及不同类型的标签分别是什么。
? ? 1>列出标签
? ??输入 git tag (可带上可选的 -l 选项 --list):
? ??这个命令以字母顺序列出标签,但是它们显示的顺序并不重要。
? ? 当然也可以按照特定的模式查找标签。 例如,Git 自身的源代码仓库包含标签的数量超过 500 个。 如果只对 1.8.5系列感兴趣,可以运行:
? ? $ git tag -l v1.8.5.*
? ??2>创建标签
? ??Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。
? ??轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。
? ??而附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件 地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。
? ??(1)附注标签创建:
? ??运行 git tag 命令时指定 -a 选项,举例如下:
? ??git tag -a v1.4 -m "my version 1.4"
? ? 说明:-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会启动编辑器要求你输入信息。
? ??通过使用 git show 命令可以看到标签信息和与之对应的提交信息:
? ? git show v1.0
? ? git show v2.0
? ? (2)轻量标签创建:
? ??轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字:
? ??$ git tag v1.4-lw
? ??$ git tag
? ??v0.1
? ??v1.3
? ??v1.4
? ??v1.4-lw
? ??这时,如果在标签上运行 git show,你不会看到额外的标签信息。 命令只会显示出提交信息。
? ? (3)后期打标签
? ??可以对过去的提交打标签,但是在打标签时需要指定commit ID信息
? ??$ git tag -a v1.2 9fceb02 -m "add additional tag info"
? ? (4)共享标签
? ??默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样——你可以运行 git push origin <tagname>
? ? 举例:git push origin v1.5
? ??如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。
? ? 举例:git push origin --tags
? ? 说明:使用 git push <remote> --tags 推送标签并不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。
? ? (5)删除标签
? ??删除标签的命令: git tag -d <tagname>
? ? 举例:?git tag -d v1.0
? ??注意:上述命令并不会从任何远程仓库中移除这个标签,你必须用 git push <remote> :refs/tags/<tagname> 来更新你的远程仓库:
? ? 举例:?git push origin :refs/tags/v1.0
? ? 另外一种删除操作方法如下:git push origin --delete <tagname>
6.Git分支别名
通过 git config 文件来轻松地为每一个命令设置一个别名
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
当要输入 git commit 时,只需要输入 git ci。 随着你继续不断地使用 Git,可能也会经常使用其他命令,所以创建别名时不要犹豫。
在创建你认为应该存在的命令时这个技术会很有用。 例如,为了解决取消暂存文件的易用性问题,可以向 Git 中 添加你自己的取消暂存别名
$ git config --global alias.unstage 'reset HEAD --'
这会使下面的两个命令等价:
$ git unstage fileA
$ git reset HEAD -- fileA
这样看起来更清楚一些。 通常也会添加一个 last 命令,像这样:
$ git config --global alias.last 'log -1 HEAD'
可以轻松地使用git last看到最后一次提交。
二、Git分支
1.分支简介
?1>分支简介?
? Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照,在进行提交操作时,Git 会保存一个提交对象(commit object)。 知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓 名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象,
??为了更加形象地说明,我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。 暂存操作会为每一个文件计算校验和(使用我们在 起步 中提到的 SHA-1 哈希算法),然后会把当前版本的文件快照保存到Git 仓库中 (Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交:
$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'
? 当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和, 然后在 Git 仓库中这些校验和保存为树对象。随后,Git 便会创建一个提交对象, 它除了包含上面提到的那些信息 外,还包含指向这个树对象(项目根目录)的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。现在,Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个 树 对象 (记录着目录结构和 blob 对象索引)以及一个 提交 对象(包含着指向前述树对象的指针和所有提交信息)。
??Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 master 分支会在每次提交时自动向前移动。
? 说明:Git 的 master 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。
? 2>分支创建
? 使用git branch name创建分支
? 例子:git branch testing
? 说明:git branch 命令仅仅 创建 一个新分支,并不会自动切换到新分支中去,当前还在默认master分支。(切换方法:git checkout -b branch_name)
??使用 git log 命令查看各个分支当前所指的对象。 提供这一功能的参数是 --decorate。
??$ git log --oneline --decorate
??f30ab?(HEAD ->?master, testing) add feature #32 - ability to add new
? formats to the central interface
? 34ac2 Fixed bug #1328 - stack overflow under certain conditions
? 98ca9 The initial commit of my project
? 如上所示:当前 master 和 testing 分支均指向校验和以 f30ab 开头的提交对象。
? 创建分支时同时切换至新建分支的方法: git checkout -b <newbranchname>?
? 3>分支切换
??使用 git checkout命令切换到已存在的分支
??$ git checkout testing
??这样 HEAD 就指向 testing 分支了。
??git log --oneline --decorate
??d42f846?(HEAD ->?testing, master) The initial commit of my project
??对test.rb文件做些修改,再次提交,
??$ vim test.rb
??$ git commit -m “made a change”
??再次查看发现testing分支的HEAD已经指向了新生成的节点信息,而master的HEAD没有改变,指向原来的节点信息d42f846
??hongtao.wang@fae01:~/work/build/VCS/branch$?git log --oneline --decorate
??515796b?(HEAD ->?testing) made a change
??d42f846?(master) The initial commit of my project
??现在,这个项目的提交历史已经产生了分叉(参见 项目分叉历史)。 因为刚才你创建了一个新分支,并切换过去进行了一些工作,随后又切换回 master 分支进行了另外一些工作。 上述两次改动针对的是不同分支:你可以在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来。 而所有这些工作,你需要的命令只有branch、checkout 和 commit。
? 此时使用 git log 命令查看分叉历史。 运行 git log --oneline --decorate --graph --all ,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。
??$ git log --oneline --decorate --graph --all
??*?b616dba?(master) made other changes
??| *?515796b?(HEAD?->?testing) made a change
??|/??
??*?d42f846?The initial commit of my project
2.分支的新建与合并
? 1>新建分支:
? git checkout -b new_name
??等效于如下两条命令:
??git branch new_name
??git checkout new_name
? 2>合并分支:
??合并分支方法: git merge branch_name
??先切换至待操作的分支,以master为例
??git checkout master
??git merge new_branch
??说明:
??切换分支之前,先把当前分支的修改提交,确保当前状态是干净的。
? 3>分支删除:
??git branch -d branch_name?
??4>遇到冲突时的分支合并
??如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们,在合并它们的时候就会产生合并冲突:
? $ git merge iss53
? Auto-merging index.html
? CONFLICT (content): Merge conflict in index.html
? Automatic merge failed; fix conflicts and then commit the result
?此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:
??任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:
? <<<<<<< HEAD:index.html
? <div id="footer">contact : email.support@github.com</div>
? =======
? <div id="footer">
? ?please contact us at support@github.com
? </div>
? >>>>>>> iss53:index.html
这表示 HEAD 所指示的版本(也就是你的 待merge分支所在的位置,因为你在运行 merge 命令的时候已经检出
到了这个分支)在这个区段的上半部分(======= 的上半部分),而 当前分支所指示的版本在 ======= 的 下半部分。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。 例如,你可以通过把这段内容换成下面的样子来解决冲突:
上述的冲突解决方案仅保留了其中一个分支的修改,并且 <<<<<<< , ======= , 和 >>>>>>> 这些行被完全删除了。 在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这 些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
? 说明:手动解决完所有conflict后,记得执行git commit进行提交修改。
3. 分支管理
1> git branch命令
git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表,
$ git branch
? iss53
* master
? testing
注意 master 分支前的 * 字符:它代表当前所在分支。这意味着如果在这时候提交,master 分支将会随着新的工作向前移动。 如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令:
2>参数--merged 与 --no-merged?
git branch --merged用于查看哪些分支已经合并到当前分支
$ git branch --merged
? iss53
* master
因为之前已经合并了 iss53 分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
git branch --no-merged用于查看所有包含未合并工作的分支。
这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:
如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/24 10:23:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |