Git
基本
(file为具体文件名)
git add file将工作区文件存入暂存区
git commit -m “” 将暂存区文件提交至分支并加注释
git status 掌握仓库当前的状态 看修改和增加的状况
git diff file 查看具体修改
git log 查看提交的历史日志 可以看到commit id
HEAD指向当前的版本 当前分支
git reset —hard HEAD^ 回到上一版本
git reset —hard (commit id 前几位) 回到对应的版本
git reflog 查看命令历史 可以确定版本的id
cat file 查看文件内容
Git管理的是修改而不是文件
git diff HEAD — file 查看工作区和版本库里面最新版本的区别
rm file 就是在工作区删文件
git rm file 就是删文件,并且把删文件的修改提交到暂存区 相当于rm删文件后,git add 提交 要撤回和上述相同
改错要撤回
- 改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,git restore file 回到最近一次git commit或git add时的状态
- 不但改乱了工作区某个文件的内容,还添加到了暂存区时(add),第一步git restore —staged file,把暂存区的修改撤销掉,重新放回工作区,就回到1,第二步按1操作。
- 已经提交了不合适的修改到版本库时(commit),想要撤销本次提交,版本回退git reset —hard HEAD^ 工作区,暂存区,版本库都是上次的内容
远程仓库github
- 关联远程库:
在GitHub上新建仓库 git remote add origin git@github.com:vzerzz/gitest.git 把本地仓库和远程仓库关联 远程库的名字就是origin
git push -u origin master 把当前分支master推送到远程 第一次加-u直接把本地master和远程master关联
之后本地提交后可直接git push origin master 推送分支git push origin dev
git remote -v 查看远程库信息 显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
git remote rm origin 解除了本地和远程的绑定关系 远程库未删除(在GitHub删)
好处:本地提交可无网络 有网了直接push到远程库 - 克隆远程库:
git clone git@github.com:vzerzz/gitest.git
库内容会在gitest文件夹中 此时库已和远程库关联 - 参与别人项目:
Fork 在自己的账号下克隆了一个别人的仓库
从自己的账号下clone仓库(一定要自己的 别人的没有权限推送修改)
修改完后推送给自己的仓库 希望别人能接受你的修改,那就在GitHub上发起一个pull request
分支
分支可视作指针 master是指向提交 HEAD指向当前分支
git checkout -b dev 创建并切换到dev分支 git branch dev +git checkout dev
git branch 查看当前分支
git log —graph —pretty=oneline —abbrev-commit 查看分支历史
在dev上提交 切换回master后看不见修改
git merge dev 合并dev分支到当前分支(快速合并) 可以看见修改
git branch -d dev 删除dev分支当master分支和dev分支各自都分别有新的提交 则无法快速合并 只能试图把各自的修改合并起来,但这种合并就可能会有冲突 只能修改后再合并
禁用Fast forward Git就会在merge时生成一个新的commit 不删除分支
git merge —no-ff -m “merge with no-ff” dev 加上-m参数,把commit描述写进去 合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
分支策略:
master分支仅用来发布新版本,不能在上面干活 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以
当dev分支工作没有完成时,去修别的分支的bug 先把git stash一下,工作现场“储藏”起来(此时status是干净的)然后换分支去修复bug,换回来后再git stash pop,恢复工作现场的同时把stash内容也删了(或git stash apply恢复 git stash drop删除)
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick commit id(修复bug操作的commit id),把bug提交的修改“复制”到当前分支 相当于把修改又提交了一次
要丢弃一个没有被合并过的分支,可以通过git branch -D dev强行删除
master分支是主分支 dev分支开发分支 bug分支修复bug feature分支实现新功能多人开发:
git clone下来只是一个本地的master
再git checkout -b dev origin/dev创建本地dev上修改 提交到本地master后
再远程提交到origin的dev分支 git push origin dev
如果另一个人早在你之前在远程提交更新了dev 那么可能会有冲突 此时git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送
如果失败则git branch —set-upstream-to=origin/dev dev 指定本地dev分支与远程origin/dev分支的链接 再pull 之后手动解决合并冲突之类的push即可
git pull 后 git rebase 把你的提交“放置”在远程拉取的提交之后 把分叉的提交历史“整理”成一条直线,看上去更直观
标签
标签不能移动 相当于一个commit的引用别称之类
git tag v1.0 用于新建一个标签,默认为HEAD,也可以指定一个commit id
git tag 查看所有标签 git show v0.9 查看标签信息
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签
git tag -d v0.1 删除标签 创建的标签都只存储在本地,不会自动推送到远程
推送某个标签到远程 git push origin tagname
一次性推送全部尚未推送到远程的本地标签 git push origin —tags
删除远程标签先删本地 git tag -d v0.9 再删远程 git push origin :refs/tags/v0.9
.gitignore
在Git工作区的根目录下创建.gitignore文件,把要忽略的文件名填进去,Git就会自动忽略这些文件
.gitignore文件模板1
2
3*.exe # 排除所有.exe结尾的文件
.* # 排除所有.开头的文件
!.gitignore # 不排除.gitignore
git add -f filename 强制添加到Git
指令