Git学习笔记

git

git简介

git安装

  • Linux
apt install git
# 如果找不到
apt search git
  • Windwos
官网下载
https://git-scm.com/

git配置

  • 验证是否安装完成:git->git bash->命令窗口
  • git config --global user.name"your name"
  • git config --global user.email"email@example.com"
  • –global 表示这台机器上所有的git仓库都使用这个配置,针对不同的git仓库也可以指定不同的用户名和邮箱
# 查看配置
git config -l 

# 查看系统的config
git config --system --list

# 查看当前用户(global)配置
git config --global --list

repository创建

本地仓库搭建
  • windows,确保目录名(包括父目录)不包含中文
  • 1.选择一个合适的地方
  1. mkdir learngit
  2. cd learngit
  3. pwd
    5.git init 初始化仓库,使其成为一个可管理的git仓库(会多一个隐藏目录.git)
# 自己要与origin master建立连接(下划线远程仓库链接)
git remote add origin http://
# 把远程分支拉到本地(game-of-live-first_branch为远程仓库的分支名)
git fetch origin game-of-live-first_branch
# 在本地创建分支game-of-live-first_branch并切换到该分支
git checkout -b game-of-live-first_branch origin/game-of-live-first_branch
# 把game-of-live-first_branch远程分支上的内容都拉取到本地
git pull origin game-of-live-first_branch
# 与远程的仓库建立连接
git branch --set-upstream-to=origin/develop

# 补充:::
# *如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
# $git push origin test:master         // 提交本地test分支作为远程的master分支
# $git push origin test:test              // 提交本地test分支作为远程的test分
克隆远程仓库
# 克隆一个项目和它的整个代码历史(版本信息)
git clone

添加文件

  • 1.新建一个readme.txt文件必须放在git仓库里
    2.git add readme.txt :添加文件,无任何显示
    3.git commit -m “wrote a readme file” :提交文件,-m后面输入的是本次提交的说明(成功后,1 file change;2 insertions插入两行内容)
  • 一次提交多个文件
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
  • 遇到的问题:
    git add readme.txt

    • fatal: not a git repository (or any of the parent directories)

      • Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的。
    • fatal: pathspec ‘readme.txt’ did not match any files

      • 添加某个文件时,该文件必须在当前目录下存在,用ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。

工作流程

请添加图片描述

时光机穿梭

文件的四种状态

  • Untracked:未跟踪,此文件在文件夹中,但并没有加入到git仓库,不参与版本控制.通过git add 状态变为Staged.
  • Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹完全一致.这种类型的文件有两种去处,如果它被修改,而变为Modified.如果使用git rm 移出版本库,则成为Untracked文件.
  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作.这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout,则丢弃修改过,返回unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改!
  • Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态.执行git reset HEAD filename取消暂存,文件状态为Modified

修改

  • git status :随时掌握工作区的状态
  • git diff readme.txt :查看修改的内容

版本回退

  • git log

    • 命令显示从最近到最远的提交日志

    • –pretty=oneline

      • 简易显示
    • 一长串的数字是十六进制表示的commit id

  • git reset --hard HEAD^

    • 回退到上一个版本

    • HEAD^^

      • 回退到上上个版本
    • HEAD~100

      • 回退上100个版本
  • cat readme.txt

    • 查看文件
  • git reflog

    • 查看历史命令
    • 确定回到未来的版本commit id

工作区和暂存区

  • learngit :工作区

  • .git :版本库

    • stage(index)

      • 暂存区:add的东西都会先存在暂存区
    • master

      • commit将暂存区的所有东西都移到master中
    • head

      • 指向master的指针

管理修改

  • 每次修改,如果不用git add到暂存区,那就不会加入到commit中

    • 要修改时必须先add,再commit。

撤销修改

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git restore readme.txt

  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git restore --staged readme.txt,就回到了场景1,第二步按场景1操作。

    • 直接丢弃所有的更改,回到head所指的master版本:git checkout --HEAD readme.txt
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

  • untracked文件:(use “git rm --cached …” to unstage)

删除文件

  • rm test.txt

    • 删除一个文件
  • 当删除了一个文件,工作区和版本库不一致

    • 场景1:删除

      • 1.git rm test.txt

        • tip:git rm 和git add效果是一样的
      • 2.git commit -m"remove test.txt"

    • 场景2:删错了,恢复

      • 版本库里没有:无法恢复

      • 版本库里有:git check out – test.txt

        • 一件还原

远程仓库

添加远程仓库

  • 1.创建SSH KEY

    • 打开 git bash
    • ssh-keygen -t rsa -C “youremail@example.com”
    • 用户主目录里找到.ssh目录,里面有id_rsa(私钥)和id_rsa.pub(公钥)
  • 2.打开github–>account settings–>ssh keys–>设置任意titile–>在文本框粘贴id_rsa.pub文件的内容–>add key

    • 想在已存在的repository中添加ssh:setting–>deploy keys–>add deploy key–>粘贴id_rsa.pub文件的内容
  • 3.Create a new repo–>输入Repository name–>create repository

  • 4.将本地仓库的内容推送到github仓库

    • 在本地仓库下运行命令关联远程库:git remote add origin git@github.com:sobermh/learngit.git

      • 远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
    • 推送本地库的所有内容:git push -u origin master

      • 用git push命令,实际上是把当前分支master推送到远程。
      • 第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
    • 从现在起,只要本地作了提交,就可以通过命令:git push origin master

  • 注意事项

    • ssh警告

      • SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
      • 如果你实在担心有人冒充GitHub服务器,输入yes前可以对照https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints是否与SSH连接给出的一致。
    • 删除远程库

      • 1.先查看远程库信息:git remote -v

      • 2.git remote rm origin删除origin库

        • 只是解除了本地和远程的绑定关系。
        • 删除远程库,登录github,在后台页面删除

从远程仓库克隆

  • git clone git@github.com:sobermh/learngit.git
  • Git支持多种协议,包括https,但ssh协议速度最快。

分支管理

在这里插入图片描述

创建与合并分支

  • 查看分支(list all of the branches in your repo)

    • git branch
      • -v详情
  • 创建分支

    • git branch
  • 切换分支

    • git switch

      • 或 git checkout (因为git checkout既可以恢复工作树文件(撤销操作),又可以切换分支,这样可能会有一些歧义的出现,所以新版本建议适用git switch)
  • 创建+切换分支

    • git switch -c

      • 或 git checkout -b
  • 合并某分支到当前分支

    • git merge
  • 删除分支

    • git branch -d

解决冲突

  • 1.git merge feature1

    • 会出现合并冲突
  • 2.git status

    • 查看冲突的文件
  • 3.手动修改冲突

  • 4.add+commit

  • 5.git log --graph --pretty=oneline --abbrev-commit

    • 查看分支合并情况
    • git log --graph查看分支合并图

分支管理策略

  • 强制禁用fast forward模式
    通常,合并分支时,Git会用快速合并模式(Fast forward),但这种模式下,删除分支后,会丢掉分支信息。
    如果用普通合并模式,从分支历史上就可以看出分支信息。

    • git merge --no-ff -m “merge with no-ff” dev
    • 因为本次合并要创建一个新的commit,所以加上-m参数,且描述
  • ff和–no-ff的区别:

    • 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

bug分支

  • 1.有工作正在进行时,需要将工作现场储存;git stash(git status查看工作区是否干净)

  • 2.保存工作现场之后,再切换到对应的分支进行bug处理,然后add+commit+merge

  • 3.回到之前正在工作的分支,使用git stash list查看

  • 4.恢复藏匿工作区的内容

    • git stash apply stash@{0} 恢复+git stash drop删除

    • git stash pop

      • 恢复的同时直接删除stash内容
  • 同样的bug,在master上修复后,需要到dev上修复

    • git cherry-pick < commit id>

      • id在master上输入 git log --graph --pretty=oneline查看
      • 例如:git cherry-pick 4c805e2

feature分支

  • 开发一个新feature,最好新建一个分支
  • 丢弃一个没有被合并过的分支,git branch -D

多人协作

  • 查看远程库信息

    • git remote

      • 显示远程库信息
    • git remote -v

      • 显示远程库详细信息
  • 多人协作的工作模式

    • 1.推送自己的修改

      • git push origin

        • git push 全部推送
    • 2.如果推送失败,远程分支比你的本地更新,需要先抓取远程的信息

      • git pull

      • 如果git pull失败

        • 原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:再pull
    • 3.如果合并有冲突,则解决冲突,并在本地提交

    • 4.解决完冲突后,或无冲突

      • git push origin 推送
    • 注意:

      • 在本地创建和远程分支对应的分支

        • git checkout -b branch-name origin/branch-name

          • 名称最好一致
      • 建立本地分支和远程分支的关联

        • git branch --set-upstream branch-name origin/branch-name

rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;

目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

git rebase

分支合并图

# 查看分支记录以及图
git log --graph 

标签管理

创建标签

  • git tag

    • 新建一个标签,默认为head,也可以指定一个commit id
    • git tag v0.9 f52c633
  • git tag -a -m “blablabla…”

    • 指定标签信息
  • git tag

    • 查看所有标签
  • git show

    • 查看说明文字
  • 注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

操作标签

  • 推送一个本地标签

    • git push origin
  • 推送全部未推送过的本地标签

    • git push origin --tags
  • 删除一个本地标签

    • git tag -d
  • 删除一个远程标签

    • git push origin :refs/tags/
  • 查看远程tags

    • git ls-remote --tags origin

自定义git

忽略特殊文件

  • 1.在git工作区的根目录,创建一个.gitignore文件

  • 2.将需要忽略上传的文件写入文件,例如:*.class

  • 3.将文件add、commit或push

  • 注意:

    • 强制上传 -f

      • git add -f App.class
    • 命令检查

      • git check -ignore
    • 查看哪个规则写错了

      • git check-ignore -v App.class

配置别名

  • git config --global alias.st status

    • status=st

搭建git服务器

  • https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664

sourcetree

企业化的git代码管理规范

  • master
    • master为主分支,也是用于部署的分支,需要确保master分支稳定性。master分支一般由release以及hotfix分支合并,任何时间都不能直接修改代码。
  • develop分支
    • develop分支为开发环境分支,feature分支都是基于develop分支创建的
  • feature分支
    • 开发新功能分支,分支命令以feature/开头,后面加上开发的功能模块。示例:feature/user_module
  • test分支
    • 测试环境分支
  • release分支
    • 预上线分支,UAT测试阶段使用。一般由test和hotfix分支合并
  • hotfix分支
    • 线上出现紧急问题是,需要及时修复,以master分支为基线,创建hotfix分支。修复完成后,需要合并到master分支和devolp分支。

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值