Git总结
2021-03-03 本文已影响0人
zhangwenhao
- 复习用,记录
Git
相关知识 -
Gitee
没有记录(比较简单),Git
搭建服务器也没有记录(还不太会玩linux
,有错误发出来对大家就不好啦) - 有个
SourceTree
的软件可以帮助你更好的操作git
- 这个软件添加
ssh
是在 工具 -> 选项 里面添加openSSH
- 这个软件添加
命令
安装、配置、查看相关
- 查看
git
版本
git version
- 配置所有
git
仓库
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
- 查看已配置的所有设置
git config --list
几个基本的命令
- 一个文件夹变为库
git init
- 添加文件到库中(版本库的暂存区)
- 可以添加很多最后再提交
git add 文件名 //这里文件后缀加了就要求要准确,不加不冲突就行了
git add . //添加全部文件
- 提交到
Git
(当前分支)
git commit -m "描述语句,最好不要省略"
版本、管理文件、区域理解
- 查看当前库与之前库的区别(也叫查看当前状态)
git status
- 查看具体的不同
git diff 文件名
- 查看提交日志
- 查看完后,按一下
q
即可退出日志查看状态
- 查看完后,按一下
git log //加上 --pretty=oneline 使内容更加的简洁
git log --graph --pretty=oneline --abbrev-commit // 这样还可以看见提交的描述语句
- 版本跳转
git reset --hard HEAD^ //回到上一个版本
git reset --hard 版本号 //版本号就是commit id,只需要前几位即可
- 查看每一次命令(commit id)
git reflog
- 丢弃工作区的修改(恢复到上一次修改)
git checkout -- 文件名
- 撤销掉暂存区的修改
// 修改已经被添加到了暂存区,需要结合上一步命令才能丢弃修改
git reset HEAD 文件名
- 删除工作区的文件
//想要恢复可以使用:git checkout -- 文件名 来恢复,实际上是将版本库中的文件恢复到了工作区,那么,如果版本库中没有该文件(在删除之前都没有执行 add 操作),就不能恢复了
rm 文件名
远程仓库(GitHub)
- 关联到远程仓库
github
中- 这一步是两个仓库的关联
//前提:github 与 本库都有一个库,需要将两个库关联起来
git remote add origin git@github.com:GitHub用户名/版本库名.git //其中 origin 为 git 默认的远程库名字,当然也可以用自己想的
- 推送内容到远程仓库,并将本地 master 分支与远程 master 分支关联
- 将本地 当前分支 master 推送到 远程仓库
- 也可以推送其他分支到远程库中
- 推送失败,说明有冲突,先拉下来解决了之后再push
git push -u origin master //其中,-u参数在第一次推送时使用即可,表示将两个分支关联起来
git push origin master //第一次推送之后,就可以省略 -u参数了
- 从远程库克隆
// 这里默认用的是 ssh 协议,当然也可以直接使用 url,url使用的为 https 协议
// 后面那一串在 github 版本库中的 Clone or download 按钮那里可以复制
git clone git@github.com: GitHub用户名/版本库名.git
//克隆指定分支
git clone -b 分支名 地址
- 查看远程库信息
git remote // 只能查看远程库在本地的名字:origin(默认)
git rmote -v // 可以查看抓取和推送的地址,如果没有权限查看不到推送的地址
- 合作项目,先
fork
过来,然后在自己主页clone
下来,工作完成之后,在推到自己主页,然后在pull request
即可
分支管理
- 创建分支
git branch 分支名
- 切换分支
git checkout 分支名 //git switch 分支名 为2.23之后版本使用的
- 创建并切换分支
git checkout -b 分支名 //git switch -c 分支名 为2.23之后版本使用的
- 查看分支
git branch //得到的带 * 号的为当前分支
- 合并分支
- 合并指定分支到当前分支
git merge 要合并的分支名 //如果没有发生冲突,那么就是快速合并模式,是没有提交记录的
//可以通过添加 --no-ff 参数来禁止快速合并模式,使用普通合并模式,这样可以通过 log 查看提交记录
git merge --no-ff -m "描述语句" 要合并的分支名
- 删除分支
//要删除多个直接在后面写上分支名即可,要切换到其他分支才能删除另外的分支,不能在自己分支上进行删除自己的操作
git branch -d 分支名1 分支名2 分支名3
// 删除没有被合并的分支,使用上面的命令不会成功的
// 需要使用 -D 参数来强行删除
git branch -D 分支名
- “储藏” 工作现场
git stash // 这样你在当前分支上修改的文件,添加的文件都会被储藏起来,并且这时当前的工作区是十分干净的,没有你之前在分支上的修改
- 查看储藏的工作现场有哪些
git stash lis // 查看到的记录 有 stash 号,可以用于后续指定恢复哪一个工作现场
- 恢复工作现场
git stash apply // 但是stach 内容不会被删除
git stash drop // 删除 stash 内容
git stash pop // 恢复并删除 stash 内容
git stash apply stash{0} // 恢复指定的 stash,这里是 stash{0}
- 复制一个修改提交
git cherry-pick 该修改的 commitId 号 // 只复制一个修改,跟 merge 不同
- “拉” 版本库来更新本地版本库
- 在
push
之前先pull
一下,保证与远程库没有冲突之后再push
- 在
//如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
git pull
- 在本地创建和远程分支对应的分支(创建分支,并连接起来)
- 远程库上有多个分支,但是你克隆下来只能看到一个主分支,这时候就需要使用这一步来创建分支并建立连接了
- 注意与下一个命令的区别
git checkout -b 分支名 origin/分支名 //origin为远程库在本地的名字,根据你设置的来定,默认为origin
- 建立本地分支与远程分支的连接
- 注意与上一个命令区别
//如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,就要使用下面的命令了
git branch --set-upstream-to 分支名 origin/分支名
- 把本地未push的分叉提交历史整理成直线;
-
rebase
的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
-
git rebase // 然后使用 git log --graph --pretty=oneline --abbrev-commit 进行查看提交日志
标签
- 给提交添加标签
- 创建的标签都存在本地
git tag 标签名 // 默认在当前分支最新的提交上(HEAD)
git tag 标签名 commitId // 给指定我提交打上标签
git tag -a 标签名 -m "描述性语句" commitId // 与上面的一样的
- 查看所有标签
git tag
- 查看标签的对应的提交信息
git show 标签名
- 共享标签
git push origin 标签名 //默认push是不是推送标签的,指定一下就可以了
git push origin --tags //推送全部的tag
- 删除标签
git tag -d 标签名 //本地
git push origin --delete 标签名 //删除远程库中的标签
git push origin :refs/tags/标签名 //和上一条命令一样的效果
其他
- 使
git
显示不同的颜色
git config --global color.ui true
- 忽略文件
- 让
git
进行提交时自动忽略掉一些文件,不提醒untrack file···
,这些文件不会被添加到版本库中
- 让
// 注意 .gitignore 文件本身是需要加入到版本库中的
创建一个文件,将想要忽略的文件名(有后缀加上后缀)写在这个文件里面,然后将这个文件保存并命名为:.gitignore
- 强制添加被忽略的文件到版本库中
git add -f 文件名
- 检查
.gitignore
文件所存在的问题
git check-ignore -v 被忽略的文件名
- 给命令设置别名,更快捷的操作
- 删除别名,可以在
.git
的config
配置文件中直接删除即可。修改当然也可以
- 删除别名,可以在
git config --global alias.别名 "命令" //设置好以后就可以使用 git 别名 来达到相同的效果了
补充知识
-
Git练习网站,学会用AS中提供的Git工具
-
Git文件状态(这里注意一点,Git跟踪的是文件的修改,并非文件本身)
- 这里可以这么理解:一个文件修改一次,add一次,然后再修改一次,这时候commit,提交的只是第一次的修改内容
未加入Git 工作区 暂存区(index/stage) 本地仓库 未跟踪的文件、.gitgnore文件中忽略的文件 除开未跟踪的文件,其他文件一开始就在工作区。修改后,但未add的文件 add之后,文件的修改就被存到了暂存区。一般称add操作为暂存 commit之后,暂存区中的文件修改就到了仓库中 在git中一般展示为红色 在git中一般展示为红色 在git中一般现实为绿色 正常颜色 未跟踪(Untracked) 已修改(Modified) 已暂存(Staged) 已提交(committed) -
从远程仓库中clone下来的分支是有跟踪的,比如:master -> origin/master,所以直接pull拉下来的分支会自动合并到对应的分支
-
Git的提交,可以理解为一个单链表的节点,一个节点代表一个commit内容,每次commit产生的新节点都会连接到链表的尾部
-
而分支就想当于指针,指向链表尾部(新建分支就相当于创建了一个指针,然后指向链表尾部)
-
Git从远程库拉到本地的分支,只有你拉的那一个分支。而checkout切换去其他的分支,实际上是先从远程库进行拉取,然后再切换过去
- 在AS编译器中能够看见其他分支,不代表本地有(当然,除非你都拉取过)
-
说一下git pull
- 如果只是一个git pull的话,没有指定分支,拉下来的是所有仓库的改动,这些改动都会合并到相应的跟踪分支中
- 如果指定了分支,比如:git pull origin dev:dev,就是将远程仓库中dev分支拉到本地仓库的dev分支中进行合并
-
两种合并方式(两个分支:dev_1、dev_2,下面的操作会达到的效果是一样的,都是将dev_2合并到dev_1中)
- dev_1:git merge dev_2(分叉的链表)
- 这种方式相当于在dev_1中新建一个commit,这个commit代表了dev_2的提交
- 但是dev_2还是原来的,并没有合并dev_1中的内容
- dev_2:git rebase dev_1(线性的链表)
- 将dev_2的所有commit接到了dev_1的commit尾部,这个时候dev_2就想当于合并了dev_1,但dev_1并没有合并dev_2(dev_2的指针在链表尾部,dev_1的指针还是在原来的位置(链表中间的位置))
- 需要checkout到dev_1再merge dev_2,才能将dev_2合并到dev_1
- 将dev_2的所有commit接到了dev_1的commit尾部,这个时候dev_2就想当于合并了dev_1,但dev_1并没有合并dev_2(dev_2的指针在链表尾部,dev_1的指针还是在原来的位置(链表中间的位置))
- 注意:不建议使用rebase方式,虽然在AS中查看到的commit是线性的,容易阅读,但是容易出错。所以还是建议使用merge来合并
- 记忆:merge是在当前分支的后面创建一个新节点,rebase是将当前分支移到另一个分支
- dev_1:git merge dev_2(分叉的链表)
-
两种更新方式
- git pull
- 相当于git fetch之后进行了merge,比较快捷,但不能选择合并的分支
- git fetch
- 只是将远程分支拉下来,相当于在本地创建一个远程分支(origin/xxx),然后更新内容到这个分支上
- 实际开发中,还需要我们进行合并(git merge origin/xxx),能够有选择的合并
- git pull
-
注意
- 切分支的时候,如果直接在这个工程中切的话,会有缓存,可能会出现下面这种情况
- 上一个分支的代码,在android studio中被打开了,转到了你这个分支中,但是你在其他地方是用不了的,而且你也搜索不到这个文件
- 每次切分支的时候,先切,然后clean一下
- 切分支的时候,如果直接在这个工程中切的话,会有缓存,可能会出现下面这种情况
1. 使用 git log 查看日志的时候,得到的 一串十六进制表示的数字为:commit id(只有每次提交commit时,git都会计算出来一个id号)
2. 版本记录:HEAD^:上一个版本,HEAD^^:上上一个版本,HEAD~100:往上100个版本 // 要调到指定版本需要使用版本号:只需要前面几位就行了(5,6,7位)
3. git内部有一个指向当前版本的HEAD指针,进行版本跳转时,实际上就是将指针指向指定版本,然后再更新数据即可
4. 一个文件夹中除开 .git 文件其他的都是属于工作区,.git 文件为版本库,其中重要的为: 暂存区(stage/index),还有个东西叫分支,默认有一个 master 主分支,有一个 HEAD 指针指向master。通过 add 了之后文件就添加到了版本库中的暂存区了,commit之后就提交到了分支中。
5. Git 跟踪的是修改,而不是文件,这样理解:
修改一个文件 -> git add -> 再修改一次该文件 -> git commit
修改一个文件 -> git add -> 再修改一次该文件 -> git add -> git commit
如果 git 跟踪的是文件,那么第一行操作过后,工作区就没有东西了,但事实是 git status 查看得到的是 Changes not staged for commit (提交时改变没有被暂存);而第二行操作过后,所有的修改都被添加到了暂存区中,这时候工作区已经十分干净了,所以说 Git 跟踪的是修改,而非文件
6. git 支持很多协议,如:https、ssh等。https 协议较慢,ssh 较快,默认是ssh
7. HEAD 指针是指向分支的,分支就相当于时间线,记录时间线上的修改。在一个分支上提交的修改在另外一个分支上是看不见的,这样更安全一些。当然,要是你没有指向add、commit操作,切换回来是可以看见文件的修改的,因为这就相当于手动修改文件一样,文件的修改并没有被添加到版本库中
8. 快速合并模式(Fast forward):只有一个分支对文件进行了修改,合并时。直接修改 HEAD 指针到一个分支就合并完成了,很快速。合并冲突发生时将不再是快速合并。
但是快速合并模式下,合并不会被提交,不会有记录。可以通过 --no-ff 参数来禁止快速合并模式
9. 合并冲突:不同的分支都对同一个文件进行了修改,在这两个文件合并时就会产生冲突。git status 可以告诉我们冲突的文件是哪个,然后我们对文件进行修改之后提交即可
10. 配置文件都在 `.git` 目录下的 `config` 文件中
注意
- 第一次将
git
与github
连接起来的时候要添加SSH
密匙到github
中,不然推送不会成功。具体方法网上一收就有 - 在
git bush
中复制操作使用鼠标右击来完成,不要ctrl c
项目基本操作
- 在
github
上创建一个版本库,然后邀请其他项目成员加入到该项目 -
clone
项目,就可以开始编写你的代码啦 - 编写完之后,准备
push
之前,先pull
一遍项目,如果有冲突则解决 - 解决冲突完之后,
add
加入版本库,然后commit
提交修改,最后push
即可
新版本命令改变
// 从暂存区恢复工作区
git resotre --worktree readme.txt
// 从master恢复暂存区
git restore --staged readme.txt
// 从master同时恢复工作区和暂存区
git restore --source=HEAD --staged --worktree readme.txt
其他命令
// 切换目录
cd 目录
// 查看目录下的文件
ls
常见报错
- add的时候:
warning: LF will be replaced by CRLF in ...
,Windows、Linux平台下的符号转义问题,
windows中的换行符为 CRLF, 而在linux下的换行符为LF- 解决:
git config --global core.autocrlf false
- 解决: