git常用命令

1.git branch -a 

查看所有分支

2.git checkout -b 新分支名

创建本地test01分支

3.git push --set-upstream origin 新分支名

把本地[分支名]分支推送到远程

4.git checkout -b 本地分支名 origin/远程分支名

从远程拉取远程分支到本地

5.git branch -d 分支名
删除本地分支

6.git push origin --delete 远程分支名称
删除远程分支

7:ignore 不生效
git rm -r --cached .

git add .

git commit -m 'update .gitignore'

git push

 

1.强制推送(慎用,除非你认为其他冲突等可以丢弃 或者不是很重要)
git push -- force
2.创建文件等小命令
touch a // 创建一个a文件
echo 1234 >> a // 把1234这个内容放入a文件
cat a // 打开a文件 读取出a文件中的内容
mkdir test // 创建test文件夹
rm 文件名 // 删除文件
pwd // 打印当前工作路径
3.安装git的时候 都会安装git bash和git GUI 我们完全也可以使用git GUI来提交版本 与sourcetree等功能相同
gitk // 用git命令快速打开git GUI
4.文件信息
ls // 查看当前路径下面的所有文件名
ls 文件夹名 // 查看对应文件夹中的内容
ls -l // 拉出最近git提交记录以及对应修改的文件名
ls -l -a // 拉出最近git提交记录以及对应修改的文件名,隐藏的文件也会显示
5.cd快速切换路径
cd ~ // 将工作路径快速切换到root
cd - // 将工作路径切换到上一状态
cd ../ // 切回到上一个工作路径
cd 文件夹名 // 进入某个目录
cd / // 进入根目录
6. vim模式
vim 文件名 // 新建一个文件
i 插入内容
按下esc :wq 保存并退出
按下esc :q 直接退出
vim 模式下 文件中#号开头的为注释
.project 忽略.project文件
*.obj 或者 *.exe 忽略一类文件 例如以.obj .exe 结尾的文件
git check-ignore -v .project 查看ignore中.project的位置
7.常用git 命令
git init // 初始化 在工作路径上创建主分支
git clone 地址 // 克隆远程仓库
git clone -b 分支名 地址 // 克隆分支的代码到本地
git status // 查看状态
git add 文件名 // 将某个文件存入暂存区
git add b c //把b和c存入暂存区
git add . // 将所有文件提交到暂存区
git add -p 文件名 // 一个文件分多次提交
git stash -u -k // 提交部分文件内容 到仓库 例如本地有3个文件 a b c 只想提交a b到远程仓库 git add a b 然后 git stash -u -k 再然后git commit -m "备注信息" 然后再push push之后 git stash pop 把之前放入堆栈的c拿出来 继续下一波操作
git commit -m "提交的备注信息"  // 提交到仓库
若已经有若干文件放入仓库,再次提交可以不用git add和git commit -m "备注信息" 这2步, 直接用
git commit -am "备注信息" // 将内容放至仓库 也可用git commit -a -m "备注信息"
* git commit中的备注信息尽量完善 养成良好提交习惯 例如 git commit -m "变更(范围):变更的内容"
8.存储密码凭证 设置别名 获取config信息以及配置
git config --list // 获取config信息
git config --global core.safecrlf false // 去掉git add 命令后 出现的一堆CR LF提示信息
其中CR是回车的意思 LF是换行
git config --global credential.helper wincred // 存储凭证 (可用于输入一次用户密码后,不再输入 有时我们已经用SSH key 绑定关联好了 但是每次git提交的时候 还是需要你输入用户名密码 在这个时候 敲入这个命令 将凭证存储起来 用户名密码就不需要再次输入了)
git config --global alias.ci commit // 将commit命令设置别名ci git commit命令将由git ci来代替
9.查看git常用命令
git helper -a // 查看全部git子命令
10.逐行查看文件的修改历史
git blame 文件名 // 查看该文件的修改历史
git blame -L 100,10 文件名 // 从100行开始,到110行 逐行查看文件的修改历史
11.清除
git clean -n // 列出打算清除的档案(首先会对工作区的内容进行提示)
git clean -f // 真正的删除
git clean -x -f // 连.gitignore中忽略的档案也删除
git status -sb (sb是 short branch) // 简洁的输出git status中的信息
12.删除放入暂存区文件的方法(已commit后)
git rm 文件名 // 将该文件从commit后撤回到add后
git reset HEAD^ --hard // 删除后 可以用git rm 文件名再回撤一步
13.查看提交内容
git hi -5 // 查看前5条内容
git hi --grep hello // 过滤提交信息里有hello字眼的内容
14.修改文件名以及移动
git mv a b // 把a文件名字改成b 并且直接放入git add后的暂存区
git mv b ./demos/ // 把b文件移动到demos文件夹下
15.对比工作区,暂存区,仓库的差异
git diff // 查看变更 工作区与暂存区的差异比对
git diff --cached // 暂存区与提交版本的差异
git diff HEAD // 工作区与仓库中最后一次提交版本的差别
git diff 版本哈希值 版本哈希值 // 查看这2个版本哈希之间的区别
或者 git diff HEAD~数字 HEAD~数字
git tag tt HEAD~4 给倒数第5次提交打一个tag tag名字是tt
git diff tt 就是倒数第5个版本与第一个版本之间的差异
git diff --cached tt 暂存区与倒数第5个版本之间的比对
16.查看提交信息
git show HEAD // 查看最后一次提交修改的详细信息 也可以用git show 哈希值 查看对应的内容
git show HEAD^ // 查看倒数第二次的提交修改详细信息
git show HEAD^^ 或者git show HEAD~2 查看前2次变更
git show HEAD 或 git show 哈希值 或者git show tag(标签名) 都可以查看最近一次提交的详细信息
17.查看信息
git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
// 获取git log里的树形详细信息 包括hasg 日期 提交信息 提交人等
git log --oneline //拉出所有提交信息 q是退出
git log -5 // 查看前5次的提交记录
git log --oneline -5 // 打印出的日志里面只有哈希值和修改的内容备注
git log 文件名 // 查看该文件的提交
git log --grep // 想过滤看到的内容   过滤日志
git log -n // 查看近期提交的n条信息内容
git log -p // 查看详细提交记录
18.变基操作,改写历史提交 把多次提交合并起来
git rebase -i HEAD~3 变基之后的哈希值与之前的不同 证明变基是重新做的提交 把多次提交合并成了几次提交
19.回撤操作
git commit --amend -m "提交信息" // 回撤上一次提交并与本次工作区一起提交
git reset HEAD~2 --hard // 回撤2步
git reset --files // 从仓库回撤到暂存区
git reset HEAD // 回撤暂存区内容到工作目录
git reset HEAD --soft 回撤提交到暂存区
git reset HEAD --hard // 回撤提交 放弃变更 (慎用)
git reset HEAD^  // 回撤仓库最后一次提交
git reset --hard commitid // 回撤到该次提交id的位置
git push -f -u origin 分支名 所有内容都回撤完了 将回撤后的操作强制推送到远程分支
20.标签操作
git tag // 查看列出所有打过的标签名
git tag -d 标签名 // 删除对应标签
git tag 标签名字 // 在当前仓库打个标签
git tag foo -m "message" // 在当前提交上,打标签foo 并给message信息注释
git tag 标签名 哈希值 -m "message" // 在某个哈希值上打标签并且写上标签的信息
git tag foo HEAD~4 // 在当前提交之前的第4个版本上 打标签foo
git push origin --tags // 把所有打好的标签推送到远程仓库
git push origin 标签名 // 把指定标签推送到远程仓库
git stash // 把暂存区的内容 暂时放在其他中 使暂存区变空
git stash list // 查看stash了哪些存储
git stash pop // 将stash中的内容恢复到当前目录,将缓存堆栈中的对应stash删除
git stash apply // 将stash中的内容恢复到当前目录,不会将缓存堆栈中的对应stash删除
git stash clear // 删除所有缓存的stash
git pull --tags // 把远程仓库的标签也拉取下来
git push origin :refs/tags/远程标签名 // 删除远程仓库的标签
21.分支
git branch 分支名 // 新建分支
git branch // 查看当前所有分支
git checkout 分支名 // 检出分支
git checkout -b 分支名 // 创建并切换分支
git checkout commitId 文件名(文件路径下的文件名) 还原这个文件到对应的commitId的版本
(例如src/page/attendance/attendanceSum.vue我想把它还原到2个版本之前 首先git log src/page/attendance/attendanceSum.vue找到对应想要还原的版本
复制版本提交的commitID 然后执行git checkout commitID src/page/attendance/attendanceSum.vue
这样就把attendanceSum.vue这个单个文件 还原到了对应版本)
git branch -v // 查看分支以及提交hash值和commit信息
git merge 分支名 // 把该分支的内容合并到现有分支上
git branch -d 分支名 // 删除分支
git branch -D 分支名 // 强制删除 若没有其他分支合并就删除 d会提示 D不会
git branch -m 旧分支名 新分支名 // 修改分支名
git branch -M 旧分支名 新分支名 // 修改分支名 M强制修改 若与其他分支有冲突也会创建(慎用)
git branch -r // 列出远程分支(远程所有分支名)
git branch -a // 查看远程分支(列出远程分支以及本地分支名)
git fetch // 更新remote索引
git push -u origin 分支名 // 将本地分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push 也可解决 git建立远程分支关联时出现fatal ... upstram的问题

用git如何把单个文件回退到某一版本

暂定此文件为a.jsp

1.首先到a.jsp所在目录:

通过 git  log a.jsp

查看a.jsp的更改记录

2.找到想要回退的版本号:例如 fcd2093

通过 git reset  fcd2093 a.jsp

把文件回退

3.提交本次回退

git commit -m "注释内容"

4.选中该文件

git checkout a.jsp

5.push到远程目录

git push origin branch   例如 : git push origin bugfix/req-910

版本控制系统就是负责管理来自于多个提交者(通常是开发者)之间的提交的。有时候多个开发者可能会编辑同一部分内容。一旦开发者A编辑了开发者B正在编辑的内容,冲突就会产生。为了降低冲突发生的概率,开发者们会在独立的分支内开展工作。git merge命令的主要职责就在于整合不同分支并且解决冲突。

理解merge冲突

合并和冲突是使用Git过程中的常见场景。在其他版本控制工具中冲突可能会非常浪费时间。Git让合并变得更加简单。大多数时候,Git会自行弄清楚如何自动的整合新变化。

冲突一般来自于两个不同的开发者改变了同一个文件中的同一行内容,或者一个开发者删除了另一个开发者正在修改的文件。在这类场景下,Git无法自动确定谁的改动是应该采纳的。冲突发生时只会影响到执行合并操作的开发者,而其他团队成员则不会受到任何影响。Git会对发生冲突的文件进行标记并停止合并进程。接下来就需要开发者自行进行冲突处理。

Merge 冲突的类型

进入冲突状态发生在合并过程中的两个时间点。一个是开始进行合并时,另一个是在合并过程中。接下来的内容分别关于如何解决这两种不同场景。

合并开始时的冲突

当工作目录下或者暂存区内的文件含有变更时,Git会中断合并操作。之所以Git会如此操作,是因为Git认为这些未提交的变更会被合并操作覆盖掉。这种情况发生时,并不是因为改变会与其他开发者的提交产生冲突,而是合并本身会与本地的修改产生冲突。此时需要使用git stashgit checkout,git commit或者git reset 命令使得本地仓库处于稳定状态。合并操作开始时的失败会在命令行提示如下错误信息:

error: Entry '<fileName>' not uptodate. Cannot merge. (Changes in working directory)

合并进行时的冲突

合并过程中发生的冲突意味着你的本地分支与进行合并的分支产生了冲突。也就是说你本地的代码与其他开发者的代码产生了冲突。Git会尽量合并不同分支的文件,但如果真正产生冲突仍然会将手动合并的任务交给你来处理。这种场景下Git会在命令行留下如下的错误信息:

error: Entry '<fileName>' would be overwritten by merge. Cannot merge. (Changes in staging area)

创造一个合并冲突

为了真正的了解合并冲突,下面的内容将会手动模拟创建一个冲突并且在稍后来查看和解决这个冲突。下面的代码需要您使用*nix系统的命令行Git工具,以便创建这个模拟冲突。

$ mkdir git-merge-test
$ cd git-merge-test
$ git init .
$ echo "this is some content to mess with" > merge.txt
$ git add merge.txt
$ git commit -am"we are commiting the inital content"
[main (root-commit) d48e74c] we are commiting the inital content
1 file changed, 1 insertion(+)
create mode 100644 merge.txt

上面的代码实际上做了如下几件事情:

  • 创建了一个叫做git-merge-test的目录,进入这个目录,然后初始化一个Git仓库
  • 创建一个随便含有什么内容的merge.txt文件
  • 添加merge.txt文件到仓库中然后进行提交

此时我们就拥有了一个新Git仓库,其中含有main分支,和一个有内容的merge.txt的文件。接下来,让我们创建另外一个分支,作为产生冲突的分支。

$ git checkout -b new_branch_to_merge_later
$ echo "totally different content to merge later" > merge.txt
$ git commit -am"edited the content of merge.txt to cause a conflict"
[new_branch_to_merge_later 6282319] edited the content of merge.txt to cause a conflict
1 file changed, 1 insertion(+), 1 deletion(-)

执行如上命令会产生下面的效果:

  • 创建并检出名为new_branch_merge_later的分支
  • 覆盖merge.txt文件中的内容
  • 提交新的内容

在这个新创建的分支new_branch_to_merge_later中,我们提交了重写的merge.txt的内容

git checkout main
Switched to branch 'main'
echo "content to append" >> merge.txt
git commit -am"appended content to merge.txt"
[main 24fbe3c] appended content to merge.tx
1 file changed, 1 insertion(+)

上面的一系列命令首先检出了main分支,然后向merge.txt文件中追加了新的内容,然后提交。到此为止我们的仓库中的分支状况为:两个分支,mainnew_branch_to_merge_later分别有两个新的提交。然后我们来试试执行git merge new_branch_to_merge_later命令会如何~

$ git merge new_branch_to_merge_later
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.

哐叽,果然冲突出现了。感谢Git。

如何辨认冲突内容

正如我们上面的示例所演示的一般,Git会在命令行中输出一些描述信息,以便让我们知道有冲突发生。接下来我们可以执行git status命令更加深入的检视冲突的详情。

$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

Unmerged paths:
(use "git add <file>..." to mark resolution)

both modified:   merge.txt

git status命令的输出显示了由于冲突而没有成功合并的文件路径。果不其然merge.txt文件出现在合并双方都进行修改的那一状态栏中。接下来就需要打开文件看看具体发生了什么不能合并的修改。

$ cat merge.txt
<<<<<<< HEAD
this is some content to mess with
content to append
=======
totally different content to merge later
>>>>>>> new_branch_to_merge_later

上面的命令中我们使用cat命令来显示merge.txt文件中的内容。可以看到一些奇怪的东西

  • <<<<<<< HEAD
  • =======
  • >>>>>>> new_branch_to_merge_later

可以把这些行的内容看作是“冲突的分界线”。======的那一行是冲突发生的正中间。在冲突中间和<<<<<< HEAD之间的那些行表示的是存在于当前分支——也就是当前仓库中HEAD指针指向的那个分支——的内容。相对应的在冲突中间到>>>>>>行之间的内容则是new_branch_to_merge_later分支中的内容。

如何使用命令行解决冲突

最直接的解决冲突的方式就是修改冲突的文件内容。使用你最常用的编辑器打开merge.txt文件。在本例中,我们就只是简单的把没有意义的冲突分界线删掉。然后修改之后的merge.txt文件的内容看起来就是下面这个样子:

this is some content to mess with
content to append
totally different content to merge later

一旦修改完成冲突文件,就是用git add merge.txt命令来暂存新的合并内容。敲定最终合并的方式也很简单,通过下面的命令执行一次commit即可:

git commit -m "merged and resolved the conflict in merge.txt"

这时候Git会认为冲突已经解决,然后创建一个新的合并提交来完成整个合并。

可以用来解决合并冲突的Git命令

通用工具

git status

status命令是使用Git过程中的常见命令,尤其是在merge过程中,它能帮助你辨别哪些文件处于冲突状态。

git log --merge

git log命令传递--merge参数,会将此次合并中造成冲突的来自于两个分支中的具体提交列出来。

git diff

diff有助于找到仓库或者文件在不同状态之间的异同。这通常可以用来预测或者阻止可能产生冲突的合并。

启动合并时就发生冲突场景下的常用工具

git checkout

checkout可以用来撤销对于文件或者分支的修改

git reset --mixed

reset用于撤销当前工作目录或者已经进入暂存区的变更

合并过程中发生冲突场景下的常用工具

git merge --abort

执行git merge命令时带上--abort选项将会退出这次合并,并且恢复到当前分支在进行合并之前的状态

git reset

git reset用于在合并冲突发生时,将一个文件重置到你所知道应该是正常状态的那个版本

总结

合并冲突可以是一次令人害怕的经历。幸运的是,Git提供了强大的工具来帮助寻找和解决冲突。Git可以处理大多数场景,进行自动合并。在Git中一般造成冲突的场景无非是两个独立的分支对同一个文件进行了修改,或者是当一个分支中删除了某个文件,而另一个分支在同一个文件上进行了修改。冲突通常发生在团队协作的环境中。

有许多用于解决合并冲突的工具。本文中我们讨论了很多Git提供的命令行工具。此外还有很多第三方的工具提供冲突解决工具。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值