当前位置: 首页 > news >正文

GIT个人手册

GIT个人手册

版本

日期

修订内容

作者

V01

2019-06-25

初稿

    

备注:

使用中不断迭代完善,其他人使用中有其他总结的,可以补充。

 

目录

第一章 说明

一.1.1 GIT 中文手册

一.1.2 git仓库说明(工作区、暂存区、本地仓、远程仓)1

一.1.3 git仓库说明(工作区、暂存区、本地仓、远程仓)2

四.1.1  取远程仓代码

四.1.2 取本地仓代码

四.2 git init Git 创建仓库

四.3 git clone拷贝项目

四.4 git branch分支管理:查看/新建/删除

四.5 git status 查看状态

四.6 git checkout于切换分支或恢复工作树文件

四.7 git diff 显示区别

四.8 git commit将缓存区内容添加到仓库

四.9 git commit -a 直接本地提交到仓库

四.10.6 git tag打标签

四.11 GIT 学习(在线实操)

四.11.2 git命令之add,commit,push

四.11.3 git add提交的文件的信息添加到暂存区中

四.11.4 git commit将暂存区中的文件提交到本地仓库中

四.11.5  git push 命令

四.11.6 git fetch

四.13 合并分支git merge/git rebase

四.13.1 git merge合并两个分支的

四.13.3 merge、rebase、cherry-pick、revert

四.13.4 reset(恢复某版本之后的不要)和revert(恢复某版本到下一版本)

四.13.5 理解HEAD,master

四.13.6 Github中fork 和 clone的区别 pull request

四.14.1 常见错误

五.1.1 解决git status不能显示中文

五.1.2 解决git bash 终端显示中文乱码

五.2 通过修改配置文件来解决中文乱码


 

第一章 说明

一.1.1 GIT 中文手册

https://cloud.tencent.com/developer/section/1138656

一.1.2 git仓库说明(工作区、暂存区、本地仓、远程仓)1

我们先来理解下Git 工作区、暂存区和版本库概念

工作区:

也叫 工作树,就是你在电脑里能看到的目录。

暂存区:

英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

版本库:

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

image.png

图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。 

图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。 

图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。 

当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。 

当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响

当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。 

当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操很危险,会清除工作区中未添加到暂存区的改动

当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

image.png

一.1.3 git仓库说明(工作区、暂存区、本地仓、远程仓)2

git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地,这也就是为什么我们在没有网络的环境下也能使用git提交(commit)代码,因为提交仅仅是提交到本地仓库中,待有网络之后在推送(push)到远程仓库。

 

image.png

第二章 提交代码的一个完整流程

由上面的内容,不难发现,从一开始的git status命令,根据相关提示,引出了其他相关命令。下方是对其相关命令的总结:

git status : 查看当前仓库中文件的状态。

git status -s : 文件状态的简写(M - 修改, A - 添加, D - 删除, R - 重命名,?? - 未追踪)。

git add <文件名> :将后方紧跟的文件进行暂存,以便commit使用。

(git add == git stage,推荐使用git stage代替git add,git add 只是为了和旧命令兼容)

git reset HEAD <文件名> : 将已经暂存的文件进行撤销,回到未暂存的状态。

git checkout -- <文件名> :撤销对尚未暂存文件的修改,该操作不可逆,慎用。

git commit -a : 对那些被修改的文件单尚未暂存和提交的文件进行暂存和提交。注意:对未暂存的新增文件无效。

git commit : 对暂存区的文件进行提交到本地仓库。

git push : 将本地仓库已经提交的内容发布到远端。

(我们团队提交的 git push origin  HEAD:refs/for/xxxx

先提交到HEAD:refs/for/下的分支,构建测试。

如:git push origin HEAD:refs/for/CI_2/spaDev)

第三章 GIT 使用规范

https://www.cnblogs.com/gzpblog/p/5463031.html

第四章 简略

四.1 git fetch /pull/checkout拉取代码

 

image.png

四.1.1  取远程仓代码

四.1.1.1 例子

例子1:

如果本地代码有修改则 先将本地的代码做本地提交:

git commit -m “change log...”

git fetch orign  //拉取服务器上的代码

git branch -a //查看全部分支

git  rebase  remotes/origin/tb_gl5118b_dev_v1.9_ble  //将拉取的代码合并到本地

 例子2:

//查询当前远程的版本

$ git remote -v

//获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch])

$ git fetch origin master  [示例1:获取远端的origin/master分支]

$ git fetch origin dev [示例2:获取远端的origin/dev分支]

//查看版本差异

$ git log -p master..origin/master [示例1:查看本地master与远端origin/master的版本差异]

$ git log -p dev..origin/dev   [示例2:查看本地dev与远端origin/dev的版本差异]

//合并最新代码到本地分支

$ git merge origin/master  [示例1:合并远端分支origin/master到当前分支]

$ git merge origin/dev [示例2:合并远端分支origin/dev到当前分支]

原文:https://blog.csdn.net/hanchao5272/article/details/79162130 

四.1.1.2 git fetch

git fetch将远程主机的最新内容拉到本地仓,用户在检查了以后决定是否合并到本地工作本目录

$ git fetch  <远程主机名>  //这个命令将某个远程主机的更新全部取回本地

$ git fetch  <远程主机名>  <分支名>取回特定分支的更新,可以指定分支名

$ git fetch  origin  master  最常见的命令如取回origin 主机的master 分支

取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:

$ git log -p FETCH_HEAD

git fetch后的合并:

四.1.1.3 git pull 

git pull 将远程主机的最新内容拉下来到本地工作目录后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

git pull 的过程可以理解为:

git fetch origin master       //从远程主机的master分支拉取最新内容 

git merge FETCH_HEAD    //将拉取下来的最新内容合并到当前所在的分支中

即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:

$ git pull  <远程主机名>  <远程分支名>:<本地分支名>

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

$ git pull origin next

//查询当前远程的版本

$ git remote -v

//直接拉取并合并最新代码

$ git pull origin master [示例1:拉取远端origin/master分支并合并到当前分支]

$ git pull origin dev [示例2:拉取远端origin/dev分支并合并到当前分支]

原文:https://blog.csdn.net/hanchao5272/article/details/79162130 

四.1.2 取本地仓代码

git checkout迁出一个分支的特定版本。默认是迁出分支的HEAD版本


一此用法示例:

$ git checkout  master            #//取出master版本的head。

$ git checkout  tag_name         #//在当前分支上 取出 tag_name 的版本

$ git checkout  master file_name  #//放弃当前对文件file_name的修改

$ git checkout  commit_id  file_name  #//取commit_id提交版本的file_name

$ git checkout -b dev/1.5.4 origin/dev/1.5.4

# 从远程dev/1.5.4分支取得到本地分支/dev/1.5.4

$ git checkout -- hello.rb

#这条命令把hello.rb从HEAD中签出.

$ git checkout .

#这条命令把 当前目录所有修改的文件 从HEAD中签出并且把它恢复成未修改时的样子.

#注意:在使用 git checkout 时,如果其对应的文件被修改过,那么该修改会被覆盖掉。

https://www.yiibai.com/git/git_checkout.html 

四.2 git init Git 创建仓库

git init          当前目录创建

git init newrepo   在newrepo目录创建

$ git add *.c                          

$ git add README

$ git commit -m '初始化项目版本'

以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。

四.3 git clone拷贝项目

git clone <repo>           :从现有 Git 仓库中拷贝项目(类似 svn checkout)。

git clone <repo>  <directory>:克隆到指定的目录

$ git clone <版本库的网址> <本地目录名>

$ git clone https://github.com/tensorflow/tensorflow.git

或者使用SSH协议:

$ git clone git@github.com:tensorflow/tensorflow.git

例子:

$ git  clone  git://github.com/schacon/grit.git

$ git  clone  git://github.com/schacon/grit.git  mygrit

几种效果等价的git clone写法:

git clone http://github.com/CosmosHua/locate new

git clone http://github.com/CosmosHua/locate.git new

git clone git://github.com/CosmosHua/locate new

git clone git://github.com/CosmosHua/locate.git new

四.4 git branch分支管理:查看/新建/删除

git branch    查看本地分支(同git branch -l),

git branch -r  查看远程分支

git branch -a  查看本地和远程所有分支

git branch       <branchname> //新建分支

git branch -d    <branchname> //删除本地分支

git branch -d -r  <branchname> //删除远程分支,删除后还需推送到服务器

git push origin: <branchname>  //删除后推送至服务器

git branch -m  <oldbranch> <newbranch> //重命名本地分支

四.5 git status 查看状态

git status    查看状态

git status -s  查看状态,简短输出

四.6 git checkout于切换分支或恢复工作树文件|放弃修改

$ git checkout old_cc    #切换到old_cc 分支

git checkout -- a.txt   # 丢弃某个文件,或者

git checkout -- .       # 丢弃全部(丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去,回到暂存区之前的样子。)

git checkout <folder-name>/  #git checkout 撤销多个文件,撤销整个文件夹

git checkout -- <folder-name>#git checkout 撤销多个文件,撤销整个文件夹

git checkout是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区。

  当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操很危险,会清除工作区中未添加到暂存区的改动

当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

取消修改

git恢复本地删除的文件夹取消增加的文件 

git项目中有时候会在本地增加或者删除了一些文件或者文件夹,但是又不想提交,一般情况下,我们取消本地所有修改:
git checkout .
取消指定文件修改:
git checkout  filename
取消指定文件删除:
git checkout  filename
恢复到上一个版本,则可以解决整个文件夹删除的修改:
git reset --hard HEAD^ 
取消本地增加的文件和所有修改:
git checkout . && git clean -df

四.7 git diff 显示区别

git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。

尚未缓存的改动:git diff 

查看已缓存的改动: git diff --cached (推荐使用新命令 git diff --stage)

查看已缓存的与未缓存的所有改动:git diff HEAD 

显示摘要而非整个 diff:git diff --stat 

四.7.1 git add 添加到缓存区

(git add == git stage,推荐使用git stage代替git add,git add 只是为了和旧命令兼容)

$ git add hello.php

$ git add documentation/*.txt

$ git add . # 将所有修改添加到暂存区 

$ git add * # Ant风格添加修改 $ git add *Controller # 将以Controller结尾的文件的所有修改添加到暂存区。

1.git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。

 2.一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种                 情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

https://www.yiibai.com/git/git_add.html 

https://www.yiibai.com/git/git_add.html

git add -A (git add --all的缩写)和 git add . 的区别

git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)

git add -A :是上面两个功能的合集(git add --all的缩写)

四.8 git commit将缓存区内容添加到仓库

使用 git add (git stage)命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。

$ git commit -m '第一次版本提交'

 git commit -m "提交的描述信息"

将暂存区中的文件提交到本地仓库中

git commit - a -m "提交的描述信息"

或者git commit -am "提交的描述信息",这个方法就是可以把tracked的文件提交到本地仓库,就算这件没有git add,也能提交。这个就是省略了git add这一步。

四.9 git commit -a 直接本地提交到仓库

git commit -am '修改 hello.php 文件'

四.10 git commit –amend

git commit –amend既可以对上次提交的内容进行修改,也可以修改提交说明。

https://www.jianshu.com/p/a8a2ac58f37d

四.10.1 git reset HEAD取消已缓存的内容

$ git reset HEAD hello.php 

四.10.2 撤销&回滚操作(git reset 和 get revert)

1.在工作区的代码

git checkout -- a.txt   # 丢弃某个文件,或者

git checkout -- .       # 丢弃全部(丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去,回到暂存区之前的样子。)

2.代码git add到缓存区,并未commit提交

git reset HEAD .  或者
git reset HEAD a.txt

这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化。

3.git commit到本地分支、但没有git push到远程

git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>  # 回到其中你想要的某个版
git reset --hard HEAD^  # 回到最新的一次提交
git reset HEAD^  # 此时代码保留,回到 git add 之前

4.git push把修改提交到远程仓库


    1)通过git reset是直接删除指定的commit

git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id> (git reset --hard没被commit过也没有git add过的本地文件会被删除)
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除

2)通过git revert是用一次新的commit来回滚之前的commit

git log # 得到你需要回退一次提交的commit id
git revert <commit_id>  # 撤销指定的版本,撤销也会作为一次提交进行保存

3) git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除

https://blog.csdn.net/asoar/article/details/84111841

四.10.3 git rm 从工作目录中手工删除文件

只是简单地从工作目录中手工删除文件要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。

git rm <file>   

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

git rm -f <file>

递归删除,即如果后面跟的是一个目录做为参数

git rm –r  * 

git rm –r  dir

四.10.4 git mv移动或重命名

$ git mv README  README.md

四.10.5 $ git log查看提交历史

$ git log

$ git log --oneline  查看历史记录的简洁的版本

$ git log --reverse --oneline 参数来逆向显示所有日志。

四.10.6 git tag打标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。比如说,我们想为我们的 runoob 项目发布一个"1.0"版本。

$ git tag -a v1.0 

$ git tag 查看标签

四.10.7 git remote add添加远程库

要添加一个新的远程仓库,可以指定一个简单的名字,

git remote add [shortname] [url]

  # 提交到 Github

$ git remote add  origin  git@github.com:tianqixin/runoob-git-test.git

四.10.8 $ git remote 查看当前的远程库

$ git remote

$ git remote -v 执行时加上 -v 参数,你还可以看到每个别名的实际链接地址

四.10.9 git cherry-pick

git cherry-pick用于把另一个 [本地分支]的commit修改 应用到当前分支。

实际问题 

在本地 master 分支上做了一个commit ( 38361a68138140827b31b72f8bbfd88b3705d77a ) , 如何把它放到 本地 old_cc 分支上? 

办法之一: 使用 cherry-pick.  

简单用法:

git cherry-pick <commit id>

例如:

$ git checkout old_cc    #切换到old_cc 分支

$ git cherry-pick  38361a68

1. 如果顺利,就会正常提交。结果:

Finished one cherry-pick.

# On branch old_cc

# Your branch is ahead of 'origin/old_cc' by 3 commits.

2. 如果在cherry-pick 的过程中出现了冲突

就跟普通的冲突一样,手工解决:

执行git status 看哪些文件出现冲突

$ git status 

both modified:      app/models/user.rb 

解决冲突

$ git add app/models/user.rb

#提交

git commit -c <原commit号>

git cherry-pick <commit id>:单独合并一个提交

git cherry-pick  -x <commit id>:同上,不同点:保留原提交者信息。

(能否这样理解:A君修改了heFile.c,commit ,commit id=3000但上没有push,A君将id=3000告诉 B君,B君 cherry-pick到自己得本地仓库?)

四.10.10 git push推送到远程仓库

git push [alias] [branch]

以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支,实例如下。

$ git push origin master    # 推送到 Github

(git push 后不加参数的时候,默认就是git push origin 当前的分支名,比如对本地的master分支执行git push,其实就是git push origin master,当然,如果远程仓库没有master这个分支的话,肯定会报错)。

)

四.10.11 git config 配置

git config -l  查看配置

$ git config --global  参数项  值

$ git config --global user.name "wirelessqa"  

$ git config --global user.email wirelessqa.me@gmail.com  

四.10.12 git diff

git diff:           可以使用git diff来查看未暂存文件的修改情况。

git diff --cached:  git diff --cached 或者使用 git diff --staged 来查看暂存区的修改内容

四.11 GIT 学习(在线实操)

https://learngitbranching.js.org/

https://git-scm.com/book/zh/v1

四.11.1 git仓库说明(工作区、暂存区、本地仓、远程仓)

git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地,这也就是为什么我们在没有网络的环境下也能使用git提交(commit)代码,因为提交仅仅是提交到本地仓库中,待有网络之后在推送(push)到远程仓库。

image.png

四.11.2 git命令之add,commit,push

四.11.3 git add提交的文件的信息添加到暂存区中

(git add == git stage,推荐使用git stage代替git add,git add 只是为了和旧命令兼容)

git add命令主要是用于把我们要提交的文件的信息添加到暂存区中。

四.11.3.1 git add -u [<path>]

用法有git add -u [<path>],表示把<path>中所有tracked文件中被修改过或者已经删除的信息添加到暂存库中。它不会处理untracked的文件。

四.11.3.2 git add -a [<path>]

git add -a [<path>],表示把<path>中所有tracked文件中被修改或者被删除文件和所有untracked的文件信息添加到暂存区。

四.11.3.3 git add -i [<path>]

git add -i [<path>],表示查看<path>中所有被修改过或者被删除过但是没有提交的文件。

README.md和test.txt表示已经执行了git add,已经进入到了暂存区,还没有进行提交。

测试.txt表示已经处于tracked下,被修改了,但是还没有被执行git add到暂存区。

1.1 update子命令表示把已经tracked的文件加入到暂存区。

先输入2,然后回车,然后开始选择update的文件,选1后回车,如果没有结束当前update输入,再输入回车,测试.txt文件就加入到暂存区了。如下如:

image.png

1.2 revert子命令表示把已经加入到暂存区的文件从暂存区中剔除。

操作方法和上面一样,下输入3,代表选择的是revert操作,然后选择要操作的文件,回车确定,在回车退出revert操作,文件就从暂存区中剔除了。

1.3 diff子命令

通过diff子命令,可以比较暂存区中文件和原版本的差异。

四.11.4 git commit将暂存区中的文件提交到本地仓库中

2.1 git commit -m "提交的描述信息"

将暂存区中的文件提交到本地仓库中

2.2 git commit - a -m "提交的描述信息"

或者git commit -am "提交的描述信息",这个方法就是可以把tracked的文件提交到本地仓库,就算这件没有git add,也能提交。这个就是省略了git add这一步。

四.11.5  git push 命令

git push <远程主机名> <本地分支名> : <远程分支名>

 注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。

3.1 git push origin master

如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

3.2 git push origin :master 

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master

原文:https://blog.csdn.net/u013252047/article/details/78305014 

四.11.6 git fetch

#从远程的origin仓库的master分支下载代码到本地与远程仓关联的分支,如Orign/master但不自动合并。

# 方法一

$ git fetch origin master                #从远程的origin仓库的master分支下载代码到本地的origin master

$ git log -p master.. origin/master      #比较本地的仓库和远程参考的区别$ git merge origin/master                #把远程下载下来的代码合并到本地仓库,远程的和本地的合并

# 方法二

$ git fetch origin master:temp           #从远程的origin仓库的master分支下载到本地并新建一个分支temp

$ git diff temp                          #比较master分支和temp分支的不同$ git merge temp                         #合并temp分支到master分支$ git branch -d temp                     #删除temp

理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某个branch在服务器上的最新状态’。这个列表保存在 .Git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支。当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支.一般来说, 存在两种情况:

如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD

如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD

四.11.7 git pull

$ git pull <远程主机名> <远程分支名>:<本地分支名>

举例:将远程主机origin的master分支拉取过来,与本地的branchtest分支合并。

$ git pull origin master:branchtest

如果将冒号和后面的branchtest去掉,则表示将远程origin仓库的master分支拉取下来与本地当前分支合并。
以上的git pull操作如果用git fetch来表示:

$ git fetch origin master:brantest

$ git merge brantest

四.11.8 git fetch、git pull 、git clone 的区别

git clone将其他仓库克隆到本地,包括被clone仓库的版本变化本地无需git init

$ git clone https://github.com/tensorflow/tensorflow.git

git pull是拉取远程分支更新到本地仓库的操作。git pull是相当于从远程仓库获取最新版本,然后再与本地分支merge(合并)。

(https://blog.csdn.net/weixin_41975655/article/details/82887273)

1、git fetch 相当于是从远程获取最新到本地,不会自动merge,

 

image.png

(etch的时候本地的master没有变化,但是与远程仓关联的Orign/master那个版本号被更新了,我们接下来就是在本地合并这两个版本号的代码。

)

如下指令:

git fetch orgin master //将远程仓库的master分支下载到本地当前branch中

git log -p master  ..origin/master //比较本地的master分支和origin/master分支的差别

git merge origin/master //进行合并

也可以用以下指令:

git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支

git diff tmp //將當前分支和tmp進行對比

git merge tmp //合并tmp分支到当前分支

2. git pull:相当于是从远程获取最新版本并merge到本地

image.png

git pull更新代码的话就比较简单暴力,使用git pull的会将本地的代码更新至远程仓库里面最新的代码版本

git pull origin master

git pull 相当于从远程获取最新版本并merge到本地

在实际使用中,git fetch更安全一些

(由此可见,git pull看起来像git fetch+get merge,但是根据commit ID来看的话,他们实际的实现原理是不一样的。

这里借用之前文献看到的一句话:

不要用git pull,用git fetch和git merge代替它。

git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方。看起来git pull的用法会使你吃惊,简单看一下git的使用文档应该就能说服你。

将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新。当然,除非你关闭所有的安全选项,否则git pull在你本地工作目录还不至于造成不可挽回的损失,但很多时候我们宁愿做的慢一些,也不愿意返工重来。

原文:https://blog.csdn.net/weixin_41975655/article/details/82887273 )

四.12 SPA工作中相关的知识

四.12.1 FETCH_HEAD

FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。

四.12.2 push到另外的服务器

运行如下命令
git remote -v
看到 
origin https://github.com/codedrinker/jiuask.git (fetch)
origin https://github.com/codedrinker/jiuask.git (push)
表示本地的 git 仓库关联了一个名字叫做 origin 的远端,如果想push 代码执行如下命令
git push 
因为 origin 是默认的名称,所以 git push 的全部命令是 git push origin master。 理解这个以后你的问题就解决了。使用如下命令添加一个名字叫做 gitee 远端
git remote add gitee https://gitee.com/codedrinker/jiuask.git
然后使用如下命令就可以把当前代码push到指定的远端
git push gitee master

四.12.3 gerrit中refs/for & refs/heads

refs/for & refs/heads不是git的规则,而是gerrit的规则,

refs/for/[brach] 需要经过code review之后才可以提交,而refs/heads/[beanch]不需要code review。

l举例

如果需要code review,直接执行push:

git push origin mybrach

就会报错“! [remote rejected] master -> master (prohibited by Gerrit)”必须用以下语句:

git push origin HEAD:resf/for/mybranch

“HEAD:”表示当前分支
链接:https://www.jianshu.com/p/1c52bb4c7983

image.png

https://www.cnblogs.com/0616--ataozhijia/p/4165052.html

四.13 合并分支git merge/git rebase

四.13.1 git merge合并两个分支的

image.png

git merge topic #把topic分支上的操作,重现在master上,最终结果生成一个提交节点

即下图中的H节点,C节点和G节点都是H节点的父节点。

image.png

# 将b分支合并到当前分支

git  merge  b

四.13.2 git rebase 合并多次提交纪录

git rebase -i HEAD~4

1.我们来合并最近的 4 次提交纪录,执行:

git rebase -i HEAD~4

2.这时候,会自动进入 vi 编辑模式:

s cacc52da add: qrcode

s f072ef48 update: indexeddb hack

s 4e84901a feat: add indexedDB floder

s 8f33126c feat: add test2.js

https://www.codercto.com/a/45325.html

四.13.3 merge、rebase、cherry-pick、revert

四.13.3.1 在merge与rebase

   在master分支下

   merge命令:git merge dev

   rebase命令:git rebase --onto master master dev (git rebase master dev)

   图形效果:

image.png

采用merge和rebase后,git log的区别,merge命令不会保留merge的分支的commit:

image.png

merge和rebase的区别

https://www.cnblogs.com/xueweihan/p/5743327.html

四.13.3.2 cherry-pick

   在master分支下

   命令:git cherry-pic c3

   图形如下:

image.png

http://pinkyjie.com/2014/08/10/git-notes-part-3/

git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。

例如,假设我 们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0 中的功能到v2.0中,这里就可以使用cherry-pick了。
# 先在v3.0中查看要合并的commit的commit id
git log
# 假设是 commit f79b0b1ffe445cab6e531260743fa4e08fb4048b
# 切到v2.0中
git check v2.0
# 合并commit
git cherry-pick  f79b0b1ffe445cab6e531260743fa4e08fb4048b

https://zhidao.baidu.com/question/1797054470850244227.html

四.13.3.3 revert

image.png

-m参数含义:Merge 标注为Merge: a2471f3 6a17d85,传1表示撤销到a2471f3所代表的commit,传2表示撤销到6a17d85所代表的commit。数字1,2表示的是标注冒号后的位置编号

上面例子中传参-m 2,所以撤销到6a17d85,最终文件状态与6a17d85 commit后一致(

原文:https://blog.csdn.net/secretx/article/details/51461972

四.13.4 reset(恢复某版本之后的不要)和revert(恢复某版本到下一版本)

四.13.4.1 reset

用法:

image.png

image.png

https://blog.csdn.net/yxlshk/article/details/79944535

四.13.4.2 revert

git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。

用法:

image.png
 

image.png

四.13.5 理解HEAD,master

 HEAD 在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。

四.13.6 Github中fork 和 clone的区别 pull request

fork:在github页面,点击fork按钮。将别人的仓库复制一份到自己的仓库。

clone:将github中的仓库克隆到自己本地电脑中

问题:pull request的作用

比如在仓库的主人(A)没有把我们添加为项目合作者的前提下,我们将A的某个仓库名为“a”的仓库clone到自己的电脑中,在自己的电脑进行修改,但是我们会发现我们没办法通过push将代码贡献到B中。

所以要想将你的代码贡献到B中,我们应该:

在A的仓库中fork项目a (此时我们自己的github就有一个一模一样的仓库a,但是URL不同)

将我们修改的代码push到自己github中的仓库B中

pull request ,主人就会收到请求,并决定要不要接受你的代码

也可以可以申请为项目a的contributor,这样可以直接push

(2) fork了别人的项目到自己的repository之后,别人的项目更新了,我们fork的项目怎么更新?

答:首先fetch网上的更新到自己的项目上,然后再判断、merge。这里就涉及了下一个问题,pull和fetch有啥区别。

(3)fetch+merge与pull效果一样(但是commit id 不一样,fetch+merge 比pull 多一步操作,id 多1)。但是要多用fetch+merge,这样可以检查fetch下来的更新是否合适。pull直接包含了这两步操作,如果你觉得网上的更新没有问题,那直接pull也是可以的。

合并分支解决冲突

https://blog.csdn.net/bandaoyu/article/details/103537043

四.14 注意:

git第一次提交不能使用git commit -a -m,git commit -a -m "提交信息"≠git add + git commit -m "提交信息"。git commit -a -m "提交信息"只将被tracked的文件添加到暂存区并提交

暂存文件的命令:git add <文件名>

放弃未暂存文件的修改命令:git checkout -- <文件名>

将被修改的文件暂存并提交的命令:git commit -a 

git reset HEAD <文件名>取消相关文件的暂存

正文在这里正文的样式是

https://www.runoob.com/git/git-tutorial.html

git强制覆盖本地代码

    git fetch --all
    git reset --hard origin/master
    git pull

四.14.1 常见错误

The requested URL returned error: 502

SSH 登录权限

第五章  

1、git撤销本地修改

Java

1

2

git reset --hard origin/master

git pull

2、git回退到前n个版本

如下为向前回退3个版本,git reset –hard HEAD~3

3、git多用户提交冲突一

场景:用户UserA修改了文件File1,用户UserB也修改了文件File1并成功merge到了服务器上,而UserA和UserB改动了同一个代码块,当UserA拉取代码时git无法merge此改动,就会出现如下错误提示,
error: Your local changes to the following files would be overwritten by merge: cn/trinea/appsearch/MainActivity.java
Please, commit your changes or stash them before you can merge.
这时
(1) 如果希望保存本地改动并拉下最新服务器代码,手动merge,使用命令如下:

Java

1

2

3

4

git stash

git pull

git stash pop

git diff -w cn/trinea/appsearch/MainActivity.java

其中git stash表示备份当前工作区内容到git栈中,并使当前工作区内容与上次提交时一致,然后git pull拉取最新代码,git stash pop表示从Git栈中读取最近一次保存的内容,恢复工作区的相关内容,最后git diff表示手动merge你之前冲突的文件

(2) 如果希望服务器上版本完全覆盖本地修改,使用如下命令回退并更新:

Java

1

2

git reset --hard

git pull

4、git多用户提交冲突二
场景:用户UserA提交了change A,没有merge,之后用户UserB提交了change B,merge成功。当merge change A时出错,会提示,

The change could not be merged due to a path conflict.
Please rebase the change locally and upload the rebased commit for review.

大多数人的解决方式都是拷贝改动代码,并重拉最新代码Beyond Compare,重新提交。其实几条命令就可以搞定,gerrit上先abandon原来的提交,后执行如下命令:

Java

1

2

3

4

git reset --hard HEAD~2

git pull

git fetch ssh://xxxx refs/changes/46/28146/1 && git cherry-pick FETCH_HEAD

git push gerrit:xxxxxx HEAD:refs/for/xxxxxx

其中git reset –hard HEAD~2表示本地代码后退两级,如果有问题可以多后退几次

git pull表示拉最新代码
git fetch 表示获取之前没merge成功的改动到本地,后面跟的具体地址为gerrit上该change review页面选择cherry-pick、ssh后的地址,如下图红线标识


git push 跟平时push一样

5、git命令简化

(1) 简化git push命令

通常git push命令为git push gerrit:aaa HEAD:refs/for/bbb,其实可简化为git push。
编辑git库下的.git/config文件,在[remote "remoteName"]下添加两行

Java

1

2

pushurl=gerrit:aaa.git

push=HEAD:refs/for/bbb

以后提交只需要用git push即可。

(2) 简化git add *;git commit -a;git push命令,一步完成添加、commit、push

第(1)步配好后,你还可以将命令git add *;git commit -a;git push添加别名到系统path中,如下操作:
vim ~/.bash_profile,文件最后添加

Java

1

2

# add by trinea.cn for git simplify

alias gpush='git add *;git commit -a;git push'

source ~/.bash_profile

这样以后只需要gpush即可完成添加、commit、push,当然你也可以取其他的别名如gp、gitpush、gitp。

https://www.trinea.cn/dev-tools/git-skill/

五.1 git 中文显示乱码

五.1.1 解决git status不能显示中文

现象

status查看有改动但未提交的文件时总只显示数字串,显示不出中文文件名,非常不方便。如下图: 

image.png

    原因

    在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。

    解决办法

    将git 配置文件 core.quotepath项设置为false。

    quotepath表示引用路径

    加上--global表示全局配置

git bash 终端输入命令:

git config --global core.quotepath false

--------------------- 

原文:https://blog.csdn.net/u012145252/article/details/81775362 

五.1.2 解决git bash 终端显示中文乱码

要注意的是,这样设置后,你的git bash终端也要设置成中文和utf-8编码。才能正确显示中文,例如对比如下:

image.png

在git bash的界面中右击空白处,弹出菜单,选择选项->文本->本地Locale,设置为zh_CN,而旁边的字符集选框选为UTF-8。

英文显示则是: 
Options->Text->Locale改为zh_CN,Character set改为UTF-8

如图:

image.png

五.2 通过修改配置文件来解决中文乱码

如果你的git bash终端没有菜单选项显示,还可以通过直接修改配置文件的方式来解决中文乱码问题。

进入git的安装目录

image.png

1、

为了调试bug添加一些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,

最后就差把 bugFix 分支里的工作合并回 master 分支了。你可以选择通过 fast-forward 快速合并到 master 分支上,但这样的话 master 分支就会包含我这些调试语句了。你肯定不想这样,

实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样,我们可以使用

  • git rebase -i
  • git cherry-pick

2、对之前的提交进行修改(如发现以前的提交有bug,想修改已经之前的提交)

git commit –amend对上次提交的内容进行修改,也可以修改提交说明。

对的某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage 中图片的分辨率,尽管那个提交记录并不是最新的了。

我们可以通过下面的方法来克服困难:

  • 先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前
  • 然后用 commit --amend 来进行一些小修改
  • 接着再用 git rebase -i 来将他们调回原来的顺序
  • 最后我们把 master 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!

相关文章:

  • 【FreeRTOS】FreeRTOS队列
  • 【GIT】git 合并分支和解决冲突
  • 【GIT】使用git pull文件时和本地文件冲突怎么办?
  • 【GIT】Git、GitHub、GitLab三者之间的联系以及区别
  • 【GIT】git-commit Angular规范--- 编辑中
  • 【分屏】2秒钟实现 Windows窗口多分屏的进阶技巧
  • 【GIT】Commit message 和 Change log 编写指南
  • while(1)和for(;;)的区别
  • 【GitFlow】GIT 工作流(GitFlow-如何使用Git的约定)
  • 【mesh】ESP32 官方文档(十六)ESP-MESH 编程指南
  • 【定位】TOF与TDOA
  • 【工具】source insight的使用方法整理|sourceinsight
  • 【大小端】大小端(数据在内存中的存储)
  • 【VS】vs2017无法打开“stdio.h”等源文件!
  • 【变量长度】int、long、short等在windows和linux/ 32位和64位下的长度(long long 才能保证64位)...
  • Google 是如何开发 Web 框架的
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android单元测试 - 几个重要问题
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java程序员幽默爆笑锦集
  • Kibana配置logstash,报表一体化
  • Odoo domain写法及运用
  • Promise初体验
  • Python学习笔记 字符串拼接
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 通过几道题目学习二叉搜索树
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #前后端分离# 头条发布系统
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计高校学生选课系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (已解决)什么是vue导航守卫
  • .form文件_SSM框架文件上传篇
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Core 中间件验签
  • [《百万宝贝》观后]To be or not to be?
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [acm算法学习] 后缀数组SA
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [CISCN 2023 初赛]go_session
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
  • [java基础揉碎]方法的重写/覆盖
  • [Jquery] 实现温度计动画效果
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件
  • [Node.js]连接mongodb