Git
Git tutorials
This file helps you to use git.
基本原理
对象的三种状态
- (工作区)已修改 modified :文件已修改,但是没有保存到本地文件数据库
- (暂存区)已暂存 staged :对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
- (git目录)已提交 commited : 数据已经安全的保存在本地数据库中
保存在.git目录下,其中git对象存储在 .git/objects中
git安装与设置
sudo apt-get install git
git --version
# 设置用户名和邮箱
git config --global user.name "happyfan"
git config --global user.email "2290991129@qq.com"
git基本用法
初始化git
cd /home/happyfan/my——learning/git
git init # 将文件夹变成git文件夹
git clone git@github.com:happyprotean/blogs.git # 复制远程仓库到当前目录
Add
git add readme.txt
git add readme.txt readme-copy.txt # 添加多个文件到暂存区
git add . 添加所有修改和新建的数据到暂存区
git add * 与git add . 类似,区别是会对.gitignore忽略的文件作出提示
git add -A / git add -all 添加所有被删除、被替换、被修改和新建的数据到暂存区
git add -u / git add -update 添加所有被删除和被修改的文件到暂存区
Commit
git commit -m "wrote a readme.txt file" # 将修改提交到分支
git commit --amend # 将代码追加提交到前一次commit-id中,不会增加新的版本
版本回退
# HEAD为当前版本
git reset --hard HEAD^ # 回退到上个版本
git reset --hard HEAD^^ # 回退到上上个版本
git reset --hard 168018 # (或者使用版本号,可以回退到未来的版本,只需要知道版本号)
--soft # 暂存区和工作区不变(只撤销了commit一步,add操作生效)
--mixed # (默认模式)暂存区内容被清空,工作区不变(撤销了commit和add两个操作)
--hard # 暂存区和工作区都改变,回滚到之前版本(会引起内容丢失)
git checkout -- readme.txt #撤销文件所有在工作区的修改,但不撤销已提交到暂存区的修改(本质是用版本库的版本替换工作区的版本)
git reset HEAD readme.txt # 撤销文件所有已提交到暂存区的修改,此时修改存在于工作区(可以使用checkout撤销工作区的修改)
删除文件
rm test.txt # linux系统删除文件(git中也要删除)
git rm test.txt
git commit -m "remove test.txt"
git checkout -- test.txt # 误删文件,重新恢复(其实删除也算修改的一种,重新恢复即取消删除这个修改),从未被添加到版本库的文件是无法恢复的
其他常用命令
git status # 查看git仓库状态
git diff HEAD readme.txt # 查看文件与某个版本相比,有哪些更改
git log # 查看历史提交记录, HEAD表示当前版本
git log --pretty=oneline # 精简查看提交记录
git reflog 版本的操作日志,便于回滚,可以用来撤销--hard模式的reset
远程仓库
ssh-keygen -t rsa -C "2290991129@qq.com" # 用户主目录下执行,生成.ssh目录
github创建仓库learngit
git remote add origin git@github.com:happyprotean/learngit.git
git push -u origin master # 第一次推送
git push origin master # 推送
git remote # 查看远程分支
git remote -v # 查看远程分支详细信息
git checkout -b dev origin/dev # 本地创建dev分支,并与origin/dev分支关联
# 一般先从远程库拉取代码,然后本地解决冲突,最后推送到远程
git pull # 从远程仓库拉取代码
git pull 拉取远程数据到本地,自动merge
git fetch 拉取远程数据到本地,用户触发merge
git push origin master/dev # 推送代码到远程仓库
git clone git@github.com:happyprotean/learngit.git # 从github上新克隆一个仓库在当前文件夹
git高级用法
分支管理
git branch dev # 新建dev分支,dev分支的内容与当前master一致
git checkout dev # 切换到dev分支工作,所作修改只体现在dev分支
git checkout -b dev # 等价于上面两条命令
## 最新版本git
git switch dev # 切换到dev分支工作,所作修改只体现在dev分支
git switch -c dev # 新建dev分支,dev分支的内容与当前master一致
git branch # 查看当前所有的分支,*表示所在分支
git add
git commit # dev分支与master分支此时已不同
git checkout master
git merge dev # 将dev分支合并到当前分支master,dev分支保持不变
git branch -d dev # 删除dev分支(dev分支已被合并过),建议保留dev分支
git branch -D dev # 删除dev分支(dev分支未被合并过)
-
合并分支时,git在合适的时候采用fast forward模式,但在这种模式下删除分支会丢失掉分支的信息。使用--no-ff可以禁用fast forward模式,在merge时生成新的commit,这样在分支历史上可以看出分支信息。
git checkout -b dev vim readme.txt git add readme.txt git commit -m "add merge" git checkout master git merge --no-ff -m "merge with no-ff" dev git log --graph --pretty=oneline --abbrev-commit
分支冲突
当两个分支同时对同一个文件进行修改时,在合并时会存在分支冲突,此时需要手动将合并失败的文件修改,然后在add-commit,会自动的将两个分支的文件合并。
cat readme.txt # 查看文件
git log --graph --pretty=oneline --abbrev-commit # 查看分支的合并情况
工作现场保存
git stash # 临时保存工作区,然后可以切换分支
git stash list # 查看保存的工作区
git stash pop stash@{0} # 恢复工作区,同时删除对应stash内容
等价于先 git stash apply stash@{0} + git stash drop
标签管理
标签本质上是一个指向某个commit的指针。
git tag v1.0 # 对当前所在分支最新的commit打tag
git log --pretty=oneline --abbrev-commit # 查看所有的commit
git tag # 查看所有的tag
git tag v0.9 1d8e4 # 对某一次commit打tag
git tag -a v0.9 -m "version 0.9 released" 1d8e4 # 创建带有说明的标签
git show v0.9 # tag对应commit的信息
git tag -d v0.9 # 删除标签
忽略特殊文件
*.pyc 忽略所有以pyc结尾的文件,*表示通配符
*.so
dist 忽略dist文件
!.gitignore 不排除.gitignore文件
/todo 仅忽略根目录下的todo文件夹
fold1/ 忽略fold1文件夹的所有内容
fold1/*.txt 忽略fold1/note.txt,但不忽略fold1/server/arch.txt
/fold1/child 忽略fold1/child子文件夹下的所有内容
设置别名
git config --global alias.st status # 使用st代替status,即git st
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'