Py学习  »  Git

Git学习和应用场景

浪人006 • 4 年前 • 93 次点击  
阅读 134

Git学习和应用场景

前言

本教程适合对Git有一定理解,但是由于太多命令,没有系统学习的朋友们,其实Git操作我们可以分场景进行处理,在日常工作中遇到不知如何处理的场景可以到本篇文章依次寻找解决方法,第一次在掘进发文章,希望各位大佬轻喷,多提意见,peace!

概念

首先,先了解下面几个概念

  • Workspace 工作区,就是我们最开始写代码的区域
  • Index 暂存区,有时候也叫stage,可以通过 git add 某某文件 把想提交的东西放到暂存区
  • Repository 本地仓库,把暂存区的代码commit之后就放到了本地仓库,此时会有版本号
  • Remote 远程仓库 github或码云上创建的仓库,可以用clone到本地,本地也可以push上去

这里先引用一张图解释Git 工作原理

常用命令

git init
复制代码
git add readme.txt
复制代码
git commit -m <message>
复制代码
git status #看有哪些文件被修改
复制代码
git diff # 查看修改内容
复制代码
git log # 可以查看提交历史,以便确定要回退到哪个版本
git reflog # 查看命令历史,以便确定要回到未来的哪个版本
git reset --hard commit_id # 回到哪个版本,--hard是强制性的
git checkout -- readme.txt # 把readme.txt文件在工作区的修改全部撤销,让这个文件回到最近一次git commit或git add时的状态。
复制代码

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令

分支

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支,这个分支也叫主分支(master),即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

git branch # 查看分支
git branch <name> # 创建分支
git checkout <name>
git switch <name> # 切换分支,推荐用switch
git checkout -b <name>
git switch -c <name> # 创建+切换分支
git merge dev # 合并指定分支到当前分支
git branch -d <name> # 删除分支
git branch -D <name> # 强行删除还没合并的分支
复制代码

合并分支有时候会出现冲突,如以下这种情况,在新分支修改提交后,切换到原来分支也进行修改提交,此时合并就会出现冲突

git log --graph # 查看分支合并图
git merge dev 
git status # 查看冲突文件
复制代码

删除掉讨人厌的====<<<,保留冲突内容,然后再

git add '冲突的文件'
git commit -m '冲突解决'
复制代码

标签

git的标签就是版本库的代号,标签不能移动,分支可以移动,存在即合理,我们知道commit的时候后面会有一大串的版本号,不方便沟通和标记,因此tag就出现了,毕竟 v1.0.1commit号是2sda21a要方便记忆许多

git tag <tagname> # 创建新标签
git tag # 查看所有标签
git push origin <tagname> # 可以推送一个本地标签
git push origin --tags # 推送全部未推送过的本地标签
git tag -d <tagname> # 删除一个本地标签
git push origin :refs/tags/<tagname> # 删除一个远程标签
复制代码

场景一:修改了文件想撤销

  1. 还没add到暂存区时

    git checkout -- file
    复制代码
  2. 已经add到暂存区了

    git reset HEAD <file>
    git checkout -- file
    复制代码
  3. 你还commit上去了(那没办法,不能单纯撤回一个文件了,只能回退整个仓库版本了)

    git log #看上一个版本号是什么
    git reset --hard commit_id #返回到上一个版本
    复制代码
  4. 你还还把修改后的文件上传到远程仓库了

    # 那你得赶紧用之前版本的代码覆盖掉
    git reset --hard commit_id
    # 修改并重新commit
    git commit -m "New commit message"
    # 强制上传
    git push --force
    复制代码

场景二: 删除了文件

  1. 删除本来版本库里的文件,并且不想更改

    git rm 
    git commit -m '我是真的要删除'
    复制代码
  2. 删错了想恢复

    git status # 看看误删的文件叫什么名字
    git checkout -- file # 或者去回收站里恢复
    复制代码

场景三: 新电脑要连接远程仓库

pull到远程仓库,是需要有凭证的

  1. 第一步,创建SSH key

    ssh-keygen -t rsa -C "youremail@example.com"
    复制代码
  2. 第二步,查看(在Mac上可以直接在命令行输入)

    cat id_rsa.pub
    复制代码
  3. 第三步,在github或者gitee中设置>安全设置中输入公钥

  4. 第四步,查看是否有权限能连接

    ssh -T git@github.com
    复制代码

场景四: 关联到远程仓库

  • 本地还没有版本库

    git clone git@server-name:path/repo-name.git
    复制代码
  • 本地已经有版本库

    git remote add origin git@server-name:path/repo-name.git
    
    git push -u origin master
    复制代码

    由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

场景五:公司远程仓库地址变了,需要重新提交代码

## 查看与哪个仓库关联
git remote -v
## 解除关联
git remote remove origin
## 重新关联到新的仓库
git remote add origin git@github.com:cwbdouble/test.git
## 由于老板之前在远程仓库里放了说明文档等东西,我们直接push就会报错
git push -u origin master

复制代码

image.png




    
## 因此我们需要强制把远程仓库的代码跟新到当前分支上面
git pull --rebase origin master
## 然后再push
git push -u origin master
复制代码

场景六:工作一半,接到一个代号001的bug任务需要及时处理

此时很尴尬,你在dev分支上的任务还没做完,还没发提交,此时我们只能把工作现场先储存起来,等改完bug再继续工作,还好有 stash功能

## 先把原来工作存起来
git stash
## 查看工作区是干净的
git status
## 创建bug001分支,并切换到分支中
git checkout -b bug001
## 修复bug中,一万年过去了
------------------------
## 修复完,add,commit之后,切换回原来的分支
git switch master
## 合并分支(PS:注意--no-ff参数,表示禁用Fast forward,即就算删除了bug001分支,也保存分支信息)
git merge --no-ff -m '修复完bug001并合并' bug001
## 查看工作现场
git stash list
## 恢复现场 第一种方式 stash内容不删除,再用git stash drop
git stash apply
## 第二种方式 恢复的时候把stash内容也删除
git stash pop
## 在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
git cherry-pick 4c805e2   
复制代码

场景七: 将远程dev和本地dev关联起来

git remote -v # 查看远程库信息
git push origin <branch-name> # 推送失败,则用git pull 试图合并,合并有冲突,则解决后再本地提交
# 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用以下命令解决
git branch --set-upstream-to <branch-name> origin/<branch-name>
# 如果解决完冲突,再提交,还是有冲突,那不好意思,在你修改冲突的时候又有人提交了新的代码,此时建议提前做好协商
复制代码

场景八: 不想提交所有文件到仓库中

像一些重点配置文件,包含数据库账号密码之类的,以及node_module等重要或者没什么必要的文件,我们只想保存在本地,因此,贴心的git也考虑到了,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件,文件格式支持正则表达式

GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:github.com/github/giti…

推荐学习网址

学习完以上内容,肯定想有所尝试,最后推荐个Git学习闯关网站,希望能更好地帮助大家理解

至今发现的最好的 Git 动画教程

文章参考链接:

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/55024
 
93 次点击