【GIT】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 工作区、暂存区和本地仓概念

工作区:

就是你在电脑里能看到的目录。

暂存区:

一般存放在 ".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 使用规范

git使用规范 - 风蓝6 - 博客园

第四章 简略

四.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 GitHub - tensorflow/tensorflow: An Open Source Machine Learning Framework for Everyone

或者使用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> //重命名本地分支

1、每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支”。

2、任何时候,HEAD所指向的分支就是当前分支

3、执行git reset命令HEAD指向reset命令后的事件的时间标记点

HEAD~是当前分支(时间线)上的时间标记点,包括HEAD、HEAD^、HEAD^^、HEAD~

(摘自:关于Git分支中HEAD和Master的理解 - 知乎)

HEAD~1指回退一个快照,可以简写为HEAD~
HEAD~2指回退两个快照,HEAD^主要是控制merge之后回退的方向
HEAD~才是回退的步数

四.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 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

四.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 

git add命令 -Git教程™

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既可以对上次提交的内容进行修改,也可以修改提交说明。

git commit --amend用法(摘抄) - 简书

四.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修改 应用到当前分支。

直接把某一次commit拿过来,作为最新一次commit 就像是直接摘了一颗樱桃加在链表最前面,所以叫cherry-pick

实际问题 

在本地 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 来查看暂存区的修改内容

Git 查询某次历史提交的修改内容

之后我们用git show <commit-hashId> 便可以显示某次提交的修改内容

同样 git show <commit-hashId> filename 可以显示某次提交的某个内容的修改信息。

Git获取Commit修改文件列表+代码风格检测

Git获取Commit修改文件列表
获得Git本次Commit修改的文件

#!/bin/bash# 命令格式
# 会列出compare2与compare1的不同。
# git diff --name-only <commit compare1> <compare2>
changeFiles=$(git diff --name-only HEAD~ HEAD)

例:配合cpplint,对Git本次提交修改的文件,进行codecheck。

#!/bin/bash# 需要检查的文件
checkFiles=$(git diff --name-only HEAD~ HEAD)# cpplint检查文件类型
CPPLINT_EXTENS=cc,cpp,h
# cpplint filter :  -xxx,就是去掉该项检查。+xxx,就是添加该项检查。
CPPLINT_FITER=-whitespace/line_length,-build/include_what_you_use,-readability/todo,-build/include,-build/header_guard
# cpplint.py为google的代码风格检查脚本,可百度自行获取
python cpplint.py --extensions=$CPPLINT_EXTENS --filter=$CPPLINT_FITER $checkFiles 2>&1 | tee cpplint-result.xml

 修改已提交的commit注释

两种情况:
1.已经将代码push到远程仓库
2.还没将代码push到远程仓库,还在本地的仓库中

这两种情况下的修改大体相同,只是第一种情况最后会多一步
下面来说怎么修改

先搞清楚你要修改哪次的提交注释或者哪几次的提交注释

修改最后一次注释

如果你只想修改最后一次注释(就是最新的一次提交),那好办:git commit --amend
出现有注释的界面(你的注释应该显示在第一行), 输入i进入修改模式,修改好注释后,按Esc键 退出编辑模式,输入:wq保存并退出。ok,修改完成。
例如修改时编辑界面的图:

编辑commit注释.png

修改之前的注释

修改之前的某次注释

  1. 输入:git rebase -i HEAD~2
    最后的数字2指的是显示到倒数第几次 比如这个输入的2就会显示倒数的两次注释(最上面两行)

    显示倒数两次的commit注释.png

  2. 你想修改哪条注释 就把哪条注释前面的pick换成edit。方法就是上面说的编辑方式:i---编辑,把pick换成edit---Esc---:wq.

  3. 然后:(接下来的步骤Terminal会提示)git commit --amend

  4. 修改注释,保存并退出后,输入:git rebase --continue

    提示输入的命令.png

其实这个原理我的理解就是先版本回退到你想修改的某次版本,然后修改当前的commit注释,然后再回到本地最新的版本

修改之前的某几次注释

修改多次的注释其实步骤和上面的一样,不同点在于:

  1. 同上
  2. 你可以将多个想修改的commit注释前面的pick换成edit
  3. 依次修改你的注释(顺序是从旧到新),Terminal基本都会提示你接下来的操作,每修改一个注释都要重复上面的3和4步,直到修改完你所选择的所有注释

已经将代码push到远程仓库

首先,你把最新的版本从远程仓库先pull下来,修改的方法都如上,最后修改完成后,强制push到远程仓库:git push --force origin master注:很重要的一点是,你最好保证在你强制push之前没有人提交代码,如果在你push之前有人提交了新的代码到远程仓库,然后你又强制push,那么会被你的强制更新覆盖!!!

最后,可以检查一下远程的提交记录~~


链接:https://www.jianshu.com/p/098d85a58bf1

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

Learn Git Branching

Git - Book

四.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

[Git] 关于refs/for/ 和refs/heads/ - demoblog - 博客园

四.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

这一次彻底搞懂 Git Rebase | 码农网

四.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

   图形如下:

Git笔记(三)——[cherry-pick, merge, rebase] | 进击的马斯特

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

git命令之git merge 和 git rebase的区别_百度知道

四.13.3.3 revert

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

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

原文:git revert实战_secretx的专栏-CSDN博客

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

四.13.4.1 reset

用法:

Git恢复之前版本的两种方法reset、revert(图文详解)_游笑天涯-CSDN博客_git revert

四.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也是可以的。

合并分支解决冲突

【GIT】git 合并分支和解决冲突_bandaoyu的笔记-CSDN博客

四.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 <文件名>取消相关文件的暂存

正文在这里正文的样式是

Git 教程 | 菜鸟教程


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

git stash & git pop

git图解(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。

分享git的几个小技巧,后面会根据使用补充。目前包括git撤销本地修改、git回退到前n个版本、git多用户提交冲突解决、git push简化

五.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 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!

Git中stash和stage的差别


git中stash和stage两个功能乍一看上去挺相似的。其实二者是两个完全不同的概念。

1、stash是git中的一个命令。git stash的作用是把工作区(必须是工作区中已经被git追踪到的文件)和索引中的内容暂时存到一个堆上。而且这个堆是和分支不相关的。切换分支后,依然可以看到并使用。

2、stage是git中的一个区域。如下图所示。

可能你也发现了,staging area不就是index么,的确是的。下面是从国外一个网站上找到一段话:

The staging area is a file, generally contained in your Git directory, that stores information about what will go into your next commit. Its technical name in Git parlance is the “index”, but the phrase “staging area” works just as well.

(from https://git-scm.com/book/en/v2/Getting-Started-Git-Basics)
原文链接:https://blog.csdn.net/u010037020/article/details/81537809

 

本文链接:https://my.lmcjl.com/post/10317.html

展开阅读全文

4 评论

留下您的评论.