CherieLi Student

git学习

2021-01-15
CherieLi

git –version 查看git版本

which -a git

git-cmd.exe

git-bash.exe

Git常用命令

工程准备

git init 用于在本地目录下新建git 项目仓库 //处理子仓
git submodule update –init –recursive

工程克隆:git clone

查看工作区

查看工作区的修改内容:git diff

查看工作区文件状态:git status

文件修改后提交推送

新增/删除/移动文件到暂存区:git add/ git rm/ git mv

提交更改的文件:git commit

推送远端仓库:git push origin branch_name:new_branch_name

查看日志

查看当前分支上的提交日志:git log

分支管理

列出本地分支:git branch

新建分支:git branch / git checkout -b

删除分支:git branch -d

切换分支:git checkout

更新分支:git pull

合并分支:git merge

撤销操作

强制回退到历史节点:git reset

回退本地所有修改而未提交的:git checkout

撤销commit: git reset –soft HEAD^

撤销add: git reset –hard HEAD^

清理:git reset –hard; git clean -df
分支合并

合并目标分支内容到当前分支: git merge/ git rebase

git rebase

本地仓特性分支:feat
远端仓master指定commit:123456
将特性rebase到指定commit:
1.git checkout 123456
2.git checkout -b newmaster(该分支的最新commitid为:123456)
3.git checkout feat
4.git rebase 123456
5.git push origin feat –force

代码更新

git status 查看当前状态,本地是否有更改的文件

git checkout master 切换分支

git pull –rebase 远程拉取代码

git checkout . && git clean -xdf 丢弃本地所有修改

追溯修改记录

git blame 小乌龟->Blame previous revision

代码提交

git pull –rebase

git add .

git commit –m ”Bug: BUG”

如果需要覆盖提交,则:git commit –amend

git review

指定分支提交:

git push origin develop:dev_codecheck

git config –global user.name lzy

git config –global user.email lzy@***
///默认git的日志时区是 UTC +0000,设置为中国的时区 UTC +8000 git config –global log.date local

git config –global credential.helper store

(保存git的用户名和密码,只要输入一次以后就不用输了

git config –system –unset credential.helper 清一下缓存密码

) git config –list

代码分支

\1. git branch 查看本地分支

\2. git branch -a (查看所有分支)

其中有remotes/的为远程分支

\3. git checkout –b(创建新的分支)

分支切换

git add .

git stash

git checkout ***

丢弃工作现场

Git status

Git stash list

git stash drop stash@{0}

git status

git checkout [filepath/filename]

git reset HEAD [filepath/filename]

git rebase –abort

git reflog

git reset commitid

撤销已修改的文件 git reset HEAD

撤销未跟踪文件 git checkout

清除所有未跟踪文件 git clean -dxf

删除当前目录下没有被track过的文件和文件夹git clean -df

版本切换

git log 查看有哪些commit
git log -m 查看merged的commit

git reset –hard [commitid]

(强制转换,修改的内容会被丢弃)

git cherry-pick [commitid] (git update-ref -d CHERRY_PICK_HEAD)

git reset –soft HEAD~1

(修改的内容会在缓存区)

git commit

cat .git/HEAD 查看当前 HEAD 指向哪儿

git reflog

git reset –soft HEAD~1

git reset file

git checkout file

在别人的代码上进行修改提交

git checkout origin/master

git checkout –b new 创建并切换到分支new

git cherry-pick commit-id

git commit –m “Bug: BUG***** ”

git review

生成patch

当前分支所有超前master的提交: git format-patch -M master

某两次提交之间的所有patch: git format-patch 365a..4e16 –365a和4e16分别对应两次提交的名称

应用patch

先检查patch文件:git apply –stat newpatch.patch 检查能否应用成功:git apply –check newpatch.patch

应用:git apply newpatch.patch

获取commit id

git rev-parse HEAD 获取当前最后一个的 commit hash

git rev-parse –short HEAD

复制代码仓

git clone –bare $url

git 本地commit合并为一个

git rebase -i 命令可以压缩合并多次提交 格式:git rebase -i [startpoint [endpoint]

其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。

执行这个命令后会跳到一个vi编辑器 里面的提示有: pick:保留该commit(缩写:p) reword:保留该commit,但我需要修改该commit的注释(缩写:r) edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e) squash:将该commit和前一个commit合并(缩写:s) fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f) exec:执行shell命令(缩写:x) drop:我要丢弃该commit(缩写:d)

例子: 在终端输入: git rebase -i HEAD~2 这里的 HEAD~2 表示合并最近两次的提交,进入编辑模式后,修改合入记录的pick,从上到下依次为旧commit->新commit,将最后一个commit改为squash,保存退出,然后会自动执行rebase操作并弹出commit合并界面,在将红框内的commit message修改掉,然后wq保持退出即可。再次push

1、git rebase -i HEAD~2 2表示多少个commit,从上到下以从新到老排序

2、将下面第2个pick修改为s,然后保存退出 pick 31bf5d1b IR2020060115552 update chronograf from v1.0.2 to v1.0.3 pick d6064738 BUG2020070903442 add database limit 修改为: pick 31bf5d1b IR2020060115552 update chronograf from v1.0.2 to v1.0.3 s d6064738 BUG2020070903442 add database limit

3、git push -f 推送到远端

转移仓库分支更新

A仓库B分支: git diff [commit1] [commit2] > x.patch B仓库B分支: git apply x.patch

其他学习

git是用什么语言开发的?C语言

git 可以安装在哪些操作系统上? Linux, macOS, Solaris, Windows, Raspberry Pi

git init 初始化本地仓库

git add 文件名, 把文件添加到仓库,把文件修改添加到暂存区

git commit -m , 把文件提交到仓库 , 把暂存区的所有内容提交到当前分支。

git status 查看仓库当前状态

git diff查看修改内容

git diff HEAD -- 命令可以查看工作区和版本库里面最新版本的区别

git log查看提交历史

git reflog 查看历史命令

git reset–hard HEAD^回退版本

               `HEAD`表示当前版本

          上一个版本就是`HEAD^`

          上上一个版本就是`HEAD^^`

git reset –hard commit_id在版本的历史之间穿梭

git checkout – file让这个文件回到最近一次git commitgit add时的状态。

                 本质:用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

git rm file从版本库中删除该文件,再执行git commit

git push命令把本地库的内容推送到远程

git clone命令克隆一个仓库

git branch 查看分支

git branch -v

git rev-parse –abbrev-ref HEAD获取当前分支名

git branch 创建分支

git checkout <name>或者git switch <name>切换分支

git checkout -b <name>或者git switch -c <name>创建+切换分支

git merge 合并某分支到当前分支

git branch -d 删除分支

git log --graph命令可以看到分支合并图。 git log –stat 用于查看指定提交(commit)的详细信息和更改统计。

git stash 缓存工作现场

git stash pop回到工作现场

git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

git branch -D 丢弃一个没有被合并过的分支,强行删除

git remote 查看远程库的信息

git remote –v 显示更详细的信息

修改:git remote set-url origin https://**

添加:git remote add upstream git@&&&&&&&&&

删除:git remote rm upstream

git checkout -b branch-name origin/branch-name在本地创建和远程分支对应的分支

git branch –set-upstream branch-name origin/branch-name建立本地分支和远程分支的关联

\1. 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,git checkout –file

\2. 当你改乱了工作区某个文件的内容,还添加到了暂存区,想丢弃修改,先执行git reset HEAD file,回到场景一,然后执行git checkout – < file >

\3. 提交了不合适的修改到版本库,撤销提交,用版本回退的方法

直接退回到某个patch:

\1. reset

\2. patch cherry pick 一下重新提交

ssh和http

https://blog.csdn.net/csdnlyu/article/details/79352811

如果配置了ssh, 但是无法git clone,执行:

git config –global http.sslVerify false

git config -l 检查参数配置是否正确

git remote set-url origin http://***

git remote –v

git pull –rebase 的时候可能会出现

fatal:Unable to fine remote helper for ‘http’的问题

常见问题

No upstream branch

https://blog.csdn.net/benben_2015/article/details/78803753

Unrecognized content encoding type. libcurl understands identity content encodings.

export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH加个这个就没问题了

Peer’s Certificate issuer is not recognized.

git config –global http.sslVerify false

invalid login or password

可以在控制面板的用户账户中进行修改。

Git RPC failed

1.问题:git下载代码时,报“git出现RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errfno 10054”的问题

2.解决步骤:

2.1 首先输入如下命令:   git config http.sslVerify “false”

2.2 如果输入上面命令提示报“ fatal: not in a git directory ”,则输入如下命令:git init

2.3 重新下载代码: git clone https://git.com……

2.4 如果还是git代码还是下载失败,则需要修改git缓存的大小为100MB,输入如下命令: git config –global http.postBuffer 100M

error: SSL certificate problem: unable to get local issuer certificate解决办法

执行下面命令

git config --global core.autocrlf false  
git config --global http.sslVerify false  

git diff发现整个文件被修改

现象 1.修改一行代码之后,git diff 发现整个文件都被修改;

2.git diff -b 正确显示修改的部分;

3.git diff -R 被修改的每行后面都增加了一个“^M”

4.采用网上常说的:

git config --global core.whitespace cr-at-eol //该命令可以让git diff的时候忽略换行符的差异

不能解决问题

解决方法 git diff –ignore-space-at-eol > ~test.diff git checkout . git apply –ignore-whitespace ~test.diff

前辈经验

Git进行代码管理的过程中尽量采用rebase 而不是merge

fork后如何与原仓同步

git fetch upstream
git checkout master
git merge upstream/master
git push

A仓的x分支如何与B仓的y分支保持一致

git checkout [AB共同的master commit id]
git switch -c x
git checkout master
git fetch B y:x

git checkout -b x B/y

git tag

git fetch *** 获取主干tag后,

git push -f origin --tags

git describe 与git log是否一致

git tag -d 23.3.0.1  本地删除tag
git push origin :refs/tags/23.3.0.1   远程删除tag

git tag -a 23.3.0.1 -m "view"  新建tag
git push -f origin 23.3.0.1 --tags 同步到远程仓


git tag -a tagName -m "commit"
git push origin --tag # 自己的仓库

参考链接

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000  
https://blog.csdn.net/ligang2585116/article/details/71094887  
https://education.github.com/git-cheat-sheet-education.pdf

本节小测

4/6 points (graded)

版本控制工具一节已经结束,快来做几道题看看自己掌握得如何吧~

SVN 和 Git 的相同点是?

  • 都是分布式的版本控制工具
  • 可以对目录进行精细授权
  • 可以对版本历史进行追溯
  • 可以对文件进行离线版本操作

diff 工具产生的差异结果包含哪些内容?

  • 原始文件与目标文件的名称与最后一次变化时间
  • 差异内容的定位行
  • 执行 diff 命令的人员信息
  • 以 ‘-‘ 标识的原始文件内容和以 ‘+’ 标识的目标文件的内容

以下哪些是集中式版本控制工具?

  • RCS
  • CVS
  • SVN
  • Git

以下说明正确的有?

  • diff 与 patch 是 RCS 版本控制工具之后产生的
  • diff 用来比较两个文件或者目录之前的差异
  • patch 是 diff 的反向操作
  • patch -R 中的 -R 参数可以把目标文件通过 diff 文件推导到原始文件

SVN 相对于 Git 存在一些差异有?

  • SVN 是集中式的,服务器的安全性是可以绝对保障的
  • SVN 客户端所有的操作基本上都需要与服务器通信
  • SVN 强调集中管理,不适合开源项目
  • SVN 可以提供对版本库目录的精细化授权

不知道选啥

Git 相对于 SVN 有哪些优点?

  • Git 是分布式的,”快” 是 Git 一个的特点,提交操作、查看日志等都可以离线操作
  • Git 的数据、提交全部使用 SHA1 哈希,用于保证完整性
  • Git 更适合开源项目的管理
  • Git 支持移动办公场景

安装

sudo aptitude install git

sudo aptitude install git-doc git-svn git-email gitk

yum install git

yum install git-svn git-email gitk

http://git-scm.com/

Git基本配置

系统配置

git config –system core.autocrlf

用户配置

git config –global user.name

仓库配置

git config –local remote.origin.url

换行符:CRLF, LF

Linux下面安装 Git 的方式有哪些?

  • Ubuntu 系统下通过包管理器 yum 安装
  • 通过下载源码进行编译安装
  • CentOS 系统下通过包管理器 yum 安装
  • 通过 TortoiseGit 的 exe 安装包执行安装

关于 Git 安装的操作,正确的有?

  • Ubuntu 10.10 系统下,使用 “sudo aptitude install git” 来安装 git
  • Ubuntu 10.10 系统下,使用 “sudo yum install git” 来安装 git
  • RHEL/Fedora/CentOS 等系统下,使用 “sudo yum install git” 来安装 git
  • RHEL/Fedora/CentOS 等系统下,使用 “sudo aptitude install git” 来安装 git

Git 和 TortoiseGit 的关系是?

  • 是 Git 的不同名称
  • Windows 下必须安装 TortoiseGit 才能进行 Git 操作
  • TortoiseGit 是 Windows 下提供了 Git 图形化操作界面的工具
  • Git-2.19.-64-bit.exe 从名字看应该是 Windows 下 TortoiseGit 的安装包

关于 Git 配置的说明,正确的有?

  • 用户级配置的优先级比系统级配置要低(高)
  • user.name 与 user.email 是用来设定个人身份的配置,要认真对待
  • core.autocrlf 可用来解决不同系统平台下文本换行符不同带来的问题
  • http/https 和 ssh 是常见的Git仓库访问协议,ssh 在传输上安全性更高

Git 版本控制下的三种工程区域&文件状态

版本库(Repository)

工作区(Working Directory)

暂存区(stage)

Git版本控制下的文件状态只有三种

已提交(committed)

已修改(modified)

已暂存(staged)

本节总结&小测

本节小测

4/4 points (graded)

将工作区中所有的新增文件添加到Git暂存区,以便提交,可以用什么命令?

  • git add .
  • git add -m
  • git add -p
  • git add -I

在本地Git工程中,如果在分支A上进行了一系列git add/rm/mv/commit/pull操作,会直接影响Git远端服务器上分支A的节点内容。

  • 正确
  • 错误

在Windows开发环境和默认Git配置下,如果在本地Git工程已存在名为Demo的分支,同时新建分支,并命名为demo。那么在demo分支推送远端服务器过程中,会出现分支名不识别。

  • 正确

  • 错误

在本地Git工程中,执行git pull的更新操作相对于执行git fetch的更新操作来得安全些,可以让用户在确认更新内容符合预期后再自行决定节点合并。

  • 正确
  • 错误

课后小测

11/11 points (graded)

单选题:

\1. Git 是分布式版本控制系统,下列说法错误的是?

  • 一个本地仓库可以添加不同的 remote 源对应于多个远程仓库,这样就不必一一克隆,可以节省本地空间。
  • Git 具有极高的安全性,这样才能保证分布式的仓库不被黑客篡改。
  • 本地仓库和唯一的远程仓库相对应,因此构建另外一个派生仓库时,需要单独克隆一份。 正确
  • 执行 git fetch 和远程仓库同步,为了避免远程仓库分支覆盖本地仓库分支,因此远程仓库分支都同步到本地仓库的 refs/remotes/ 下的远程分支中。

\2. 以下哪些是项目内部开源的好处?

①促进软件架构和代码的质量提升。 ②减少重复开发。 ③提高产出效率。 ④促进公司软件开发人员的整体能力提升。

  • ①②③④
  • ①②③
  • ②③
  • ① ③④

\3. 在Git内文件的状态有以下哪些?

①已修改(modified)②已提交(committed)③已暂存(staged)

  • ①②
  • ①③
  • ①②③
  • ②③

\4. 可以查看当前工作区是否干净或修改的文件处于什么状态的语句是?

  • git log
  • git branch
  • git init
  • git status

\5. 查看本地和远端所有分支的命令是?

  • git branch
  • git checkout branch
  • git branch -a
  • git checkout-a

\6. 基于本地分支master,新建分支DTS并将分支转到DTS的命令行是?

  • git checkout master
  • git branch DTS master
  • git checkout DTS master
  • git checkout -b DTS master

\7. 如果把项目中文件 hello.c 的内容破坏了,如何使其还原至原始版本?

  • 重置暂存的变更: git reset – hello.c
  • 检查当前版本的该文件: git checkout HEAD – hello.c
  • 还原修改: git revert hello.c
  • 更新文件: git update hello.c

\8. 下列表述关于组织/仓库创建的说法错误的是?

  • 创建组织只能是代码平台的管理员才能操作
  • 根据项目或者个人需要,可以自行创建组织或者仓库
  • 可以通过组织对组织下的人员/权限等进行统一配置
  • 创建的组织或者仓库,如果 visible level 是 Public, 代表未注册用户也可以查看其信息

\9. 以下哪个是修改完本地代码后提交并推送到远程仓库的正确操作顺序?

①$ git status ②$ git add [需提交的fileName] ③$ git commit ④$ git push

  • ①②③④
  • ①③
  • ③④
  • ②④

\10. 以下哪些操作可以本地获得基线上最新的代码?()

①$ git push ②$ git pull ③$ git pull –rebase ④$ git fetch origin + git merge origin/master

  • ①②③
  • ①②
  • ①③
  • ②③④

\11. 关于代码平台的 Merge Request,下列说法错误的是()

  • Merge Request 是向主仓库推荐的代码贡献的方式,不推荐通过 git push 直接修改主仓库。
  • Merge Request 创建页面的原分支和目标分支是不能修改的。
  • 从派生仓的某分支创建了 MR,如果评审不通过,向派生仓的该分支推送(或覆盖)新提交,会刷新MR。
  • Merge Request 提交被合入后,新增加的 commits 与 changes 会一起合入目标仓库的目标分支。

上一篇 安全编译选项

下一篇 spdk

Comments

Content