文章目录
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.选择一个合适的地方
- mkdir learngit
- cd learngit
- 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 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分支。