本教程适合对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
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,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.1比commit号是2sda21a要方便记忆许多
git tag <tagname> # 创建新标签 git tag # 查看所有标签 git push origin <tagname> # 可以推送一个本地标签 git push origin --tags # 推送全部未推送过的本地标签 git tag -d <tagname> # 删除一个本地标签 git push origin :refs/tags/<tagname> # 删除一个远程标签 复制代码
还没add到暂存区时
git checkout -- file 复制代码
已经add到暂存区了
git reset HEAD <file> git checkout -- file 复制代码
你还commit上去了(那没办法,不能单纯撤回一个文件了,只能回退整个仓库版本了)
git log #看上一个版本号是什么 git reset --hard commit_id #返回到上一个版本 复制代码
你还还把修改后的文件上传到远程仓库了
# 那你得赶紧用之前版本的代码覆盖掉 git reset --hard commit_id # 修改并重新commit git commit -m "New commit message" # 强制上传 git push --force 复制代码
删除本来版本库里的文件,并且不想更改
git rm git commit -m '我是真的要删除' 复制代码
删错了想恢复
git status # 看看误删的文件叫什么名字 git checkout -- file # 或者去回收站里恢复 复制代码
要pull到远程仓库,是需要有凭证的
第一步,创建SSH key
ssh-keygen -t rsa -C "youremail@example.com" 复制代码
第二步,查看(在Mac上可以直接在命令行输入)
cat id_rsa.pub 复制代码
第三步,在github或者gitee中设置>安全设置中输入公钥
第四步,查看是否有权限能连接
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 复制代码
## 因此我们需要强制把远程仓库的代码跟新到当前分支上面 git pull --rebase origin master ## 然后再push git push -u origin master 复制代码
此时很尴尬,你在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 复制代码
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学习闯关网站,希望能更好地帮助大家理解
文章参考链接: