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的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
图中左侧为工作区,右侧为版本库。在版本库中标记为 "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 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
一.1.3 git仓库说明(工作区、暂存区、本地仓、远程仓)2
git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地,这也就是为什么我们在没有网络的环境下也能使用git提交(commit)代码,因为提交仅仅是提交到本地仓库中,待有网络之后在推送(push)到远程仓库。
第二章 提交代码的一个完整流程
由上面的内容,不难发现,从一开始的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拉取代码
四.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)到远程仓库。
四.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文件就加入到暂存区了。如下如:
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,
(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到本地
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
https://www.cnblogs.com/0616--ataozhijia/p/4165052.html
四.13 合并分支git merge/git rebase
四.13.1 git merge合并两个分支的
git merge topic #把topic分支上的操作,重现在master上,最终结果生成一个提交节点
即下图中的H节点,C节点和G节点都是H节点的父节点。
# 将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)
图形效果:
采用merge和rebase后,git log的区别,merge命令不会保留merge的分支的commit:
merge和rebase的区别
https://www.cnblogs.com/xueweihan/p/5743327.html
四.13.3.2 cherry-pick
在master分支下
命令:git cherry-pic c3
图形如下:
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
-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
用法:
https://blog.csdn.net/yxlshk/article/details/79944535
四.13.4.2 revert
git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。
用法:
四.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查看有改动但未提交的文件时总只显示数字串,显示不出中文文件名,非常不方便。如下图:
原因
在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。
解决办法
将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编码。才能正确显示中文,例如对比如下:
在git bash的界面中右击空白处,弹出菜单,选择选项->文本->本地Locale,设置为zh_CN,而旁边的字符集选框选为UTF-8。
英文显示则是:
Options->Text->Locale改为zh_CN,Character set改为UTF-8
如图:
五.2 通过修改配置文件来解决中文乱码
如果你的git bash终端没有菜单选项显示,还可以通过直接修改配置文件的方式来解决中文乱码问题。
进入git的安装目录
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 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!