git1-学习笔记

1,git基础

1-0,浏览器查看命令用法-help

git help --web 命令

1-1,配置用户名和邮箱-config

git config --global user.name 'your_name'
git config --global user.email 'your_email@domain.com'

git config --local 只对某个仓库有效
git config --global 对当前用户所有仓库有效
git config --system 对系统所有登陆的用户有效
缺省等同 --local

显示config的配置,加--list
git config --list --local
git config --list --global
git config --list --system

对应./git/config文件

1-2,创建git仓库-init

  • 将已有的项目代码纳入git管理
cd 项目代码所在的路径
git init
  • 使用git直接新建一个项目
cd 某个路径
git init project    #会在当前路径下创建和project同名的文件夹
cd project

1-3,提交,查看/修改信息-add status commit log

  • 正确的工作流程:不断add将文件添加到暂存区,形成一个合适的文件集合后commit到本地仓库
git add *                 #将工作区文件提交到暂存区
  git add -u               #将已经跟踪的文件提交到暂存区

git status                #查看暂存区的状态

git commit -m'***'        #将暂存区文件提交到本地仓库
  git commit --amend       #对所在分支最近的一次提交的信息做修改

git log                   #查看提交到本地仓库的历史信息
  git log --oneline        #显示历史简介信息
  git log -n*              #显示最近的*个commit信息
  git log 分支名            #显示某个分支的信息
  git log --all            #查看所有分支历史信息
  git log --all --graph    #图形化显示分支的演进过程
  git log --oneline --all -n4 --graph
  git log --oneline master -n4 --graph

1-4,恢复-reset-checkout

  • 暂存区恢复到和HEAD(当前分支最新的commit)一致、工作区恢复到和暂存区一致、
git reset HEAD                               #暂存区恢复到和HEAD一致(全部文件)
git diff --cached                            #查看暂存区和HEAD的区别  

git reset HEAD -- filename1 filename2        #将对应的暂存区文件恢复到和HEAD一致
git status

git reset --hard log中某commit对应的哈希值      #丢弃该commit之后的commit,HEAD、暂存区、工作区都变更为此commit对应的内容

git checkout -- filename                     #将对应的工作区文件恢复到和暂存区一致
git diff filename                            #查看文件在工作区和暂存区一致

1-5,分支-branch-checkout

git branch -v                           #查看本地有多少分支
git branch -av                          #查看所有分支,包括关联的远程仓库的
git branch -d/D 分支名                   #删除分支

git checkout -b 新分支名 log中的哈希值     #基于当前分支log哈希值对应的历史数据创建新分支,并且跳转到新分支
git checkout -b 新分支名 旧分支名          #基于旧分支创建新分支
git checkout 分支名                      #分支跳转(对应./git/HEAD)

1-6,图形界面工具-gitk

gitk       #可以看一看项目树结构
gitk --all

1-7,文件重命名-mv

  • 方法一
文件改名
git add 新文件名
git rm 旧文件名
git commit -m''
  • 方法二
git mv 旧文件名 新文件名                  #该命令将工作区和暂存区文件同时重命名
git commit -m''

1-8,文件删除-rm

git rm filename                        #该命令将工作区和暂存区文件同时删除
git commit -m''

1-9,查看哈希值对应的内容-cat-file

git cat-file -p 哈希值        #查看哈希值对应对象的内容
git cat-file -t 哈希值        #查看哈希值对应对象的类别

1-10,指定不需要git管理的文件

编写 .gitignore 文件

2,场景使用-单人

2-1,调整commit-rebase

  • 先切换到需要rebase的分支

2-1-1,修改任意一次commit的提交

git rebase -i 被改变commit的父节点的id号            #交互模式进行变基操作(注意该命令最好是在自己的分支做变更,如果是已经贡献到集成分支上就不要随意变基)
修改对应操作符为r

2-1-2,将连续的多个commit整理成1个

git rebase -i 合并范围首commit的父节点的id号
修改对应操作符为s

2-1-3,将不连续的多个commit整理成1个

git rebase -i 合并范围首commit的父节点的id号(如果首节点就是分支的起始节点,此时没有父节点;可以使用首节点的id,并自行添加pick 首节点id)
将需要合并的多个commit移动到连续的一块,并修改对应操作符为s
git status
git rebase --continue

2-1-4,基于远程其他分支进行rebase

git rebase 远程仓库名/分支名

2-2,比较差异-diff

2-2-1,比较工作区和暂存区所含文件的差异

git diff
git diff -- 文件名

2-2-2,比较暂存区和HEAD所含文件的差异

git diff --cached

2-2-3,比较两次commit(同一分支)的差异

git diff 哈希值1 哈希值2
git diff HEAD HEAD^  
git diff HEAD HEAD^^

2-2-4,比较两个HEAD(不同分支)的差异

git diff HEAD1 HEAD2                    #将所有文件的差异都显示出来
git diff HEAD1 HEAD2 --filename         #只显示指定文件的差异

2-3,遇到紧急开发任务,需要暂存工作区和暂存区的内容-stash

  • 遇到紧急开发任务,需要暂存工作区和暂存区的内容,切换到紧急任务;任务完成后,需要恢复暂存的工作区和暂存区内容
git stash                          #将当前工作区和暂存区的内容存放到一个类似堆栈的结构中
git stash list                     #查看暂存
git stash apply                    #恢复到暂时存放的内容,暂时存放的内容依然保留在堆栈结构中
git stash pop                      #恢复到暂时存放的内容,堆栈中暂时存放的内容被删除了

2-4,git仓库本地备份

2-4-1,常用的传输协议:

  • 本地协议1-哑协议:/path/to/repo.git
  • 本地协议2-智能协议:file:///path/to/repo.git
  • http/https协议-平时接触到的都是智能协议:http://git-server.com:port/path/to/repo.git https://git-server.com:port/path/to/repo.git
  • ssh协议-工作中最常用的智能协议:user@git-server.com:path/to/repo.git
  • 哑协议和智能协议对比:
    • 直观区别:哑协议传输进度不可见,智能协议传输可见
    • 传输速度:智能协议比哑协议传输速度快

2-4-2,本地备份方法-clone-push

  • 本地备份的方法1-处于备份仓库时-clone
    • 在本地创建文件夹(如gitBackup),作为本地备份仓库
    • 终端cd入本地备份仓库,执行git clone --bare 原仓库地址/.git 备份名.git 会发现在本地备份仓库地址下出现了一个备份名.git文件夹
      • 智能协议:git clone --bare file://原仓库地址/.git 备份名.git
  • 本地备份的方法2-处于被备份仓库时-remote-push
    • git remote -v查看关联的远端仓库
    • git remote add 远端仓库名 file://原仓库地址/备份名.git
    • git push 远端仓库名

2-5,git与github同步

2-5-1,建立ssh连接(终端使用git bash)

Host github.com
User YourEmail@163.com
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443

重复测试ssh连接

2-5-2,关联远程仓库

  • git remote add 远程仓库名 GitHub仓库提供的ssh远程连接地址
  • git remote -v 查看关联的远程仓库有哪些

2-5-3,上传

  • git push 远程仓库名 将当前分支上传上去
  • git push 远程仓库名 远程分支名 将当前分支上传到远程仓库分支
  • git push 远程仓库名 --all 将所有分支都上传上去

2-5-4,下载

  • git fetch 远程仓库名 分支名(可选) 只是将文件下载下来
  • git pull 远程仓库名 分支名(可选) 将文件下载下来并merge(=fetch+merge)
  • git clone URL 文件名 将github上的项目整体下载下来(不用配置远程仓库)
    • clone后需要git config --add ...进行用户名和邮箱的设置

2-5-5,有时候从github仓库下载下来文件后,再push会报错-merge

  • 这是因为github仓库中有超前本地版本的文件,此时用gitk --all也会看到github远程仓库对应的分支在本地仓库的分支前面,并且会发现github仓库中的文件并没有下载下来。
  • 解决方法1-merge:在本地仓库的某分支执行命令git merge 远程仓库名/分支名
    • merge后会发现文件下载下来了,并且gitk --all会发现本地仓库的某分支与github远程仓库的分支都处于最前。
    • 如果报错 fatal: refusing to merge unrelated histories https://developer.aliyun.com/article/614459:
      git merge 远程仓库名/分支名 --allow-unrelated-histories

3,场景使用-多人

3-1,不同人修改了不同文件

  • 此时非fast-forward的push会报错,但是git有能力自动merge
  • 解决方法:
    • 2-5-4&2-5-5的类似,fetch & merge(直接pull是一样的)

3-2,不同人修改了相同文件的不同区域

  • 此时git依旧有能力自动merge,方法同3-1。

3-3,不同人修改了相同文件的相同区域

  • 此时git没有能力自动merge了,需要人工介入,此时pull也会提示CONFLICT (content)
  • 解决方法:
    • pull以后,修改发生冲突的文件,沟通调整好后将git自动生成的标记语句删除
    • git commit
    • git push

3-4.不同人将同一个文件改为不同的文件名

  • 此时git没有能力自动merge了,需要人工介入,此时pull也会提示CONFLICT (rename)
  • 解决方法:
    • pull以后,根据status的提示,rm/add文件(rm掉不要的,add需要保留的,这个需要具体协商)
    • git commit
    • git push
posted @ 2022-02-26 11:14  tensor_zhang  阅读(44)  评论(0编辑  收藏  举报