Git总结


  • 复习用,记录 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 protected]"
  • 查看已配置的所有设置
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 [email protected]: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 [email protected]: 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  origin/。
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
  • 强制添加被忽略的文件到版本库中
    • .gitignore 文件模板合集
git add -f 文件名
  • 检查 .gitignore 文件所存在的问题
git check-ignore -v 被忽略的文件名
  • 给命令设置别名,更快捷的操作
    • 删除别名,可以在 .gitconfig 配置文件中直接删除即可。修改当然也可以
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
    • 注意:不建议使用rebase方式,虽然在AS中查看到的commit是线性的,容易阅读,但是容易出错。所以还是建议使用merge来合并
      • 记忆:merge是在当前分支的后面创建一个新节点,rebase是将当前分支移到另一个分支
  • 两种更新方式

    • git pull
      • 相当于git fetch之后进行了merge,比较快捷,但不能选择合并的分支
    • git fetch
      • 只是将远程分支拉下来,相当于在本地创建一个远程分支(origin/xxx),然后更新内容到这个分支上
      • 实际开发中,还需要我们进行合并(git merge origin/xxx),能够有选择的合并
  • 注意

    • 切分支的时候,如果直接在这个工程中切的话,会有缓存,可能会出现下面这种情况
      • 上一个分支的代码,在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` 文件中

注意

  • 第一次将 gitgithub 连接起来的时候要添加 SSH 密匙到 github 中,不然推送不会成功。具体方法网上一收就有
  • git bush 中复制操作使用鼠标右击来完成,不要 ctrl c

项目基本操作

  1. github 上创建一个版本库,然后邀请其他项目成员加入到该项目
  2. clone 项目,就可以开始编写你的代码啦
  3. 编写完之后,准备 push 之前,先 pull 一遍项目,如果有冲突则解决
  4. 解决冲突完之后,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

你可能感兴趣的:(Git总结)