Git

Git tutorials

This file helps you to use git.

git cheet sheet
廖雪峰

基本原理

对象的三种状态

  • (工作区)已修改 modified :文件已修改,但是没有保存到本地文件数据库
  • (暂存区)已暂存 staged :对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
  • (git目录)已提交 commited : 数据已经安全的保存在本地数据库中

保存在.git目录下,其中git对象存储在 .git/objects中

git-repo

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-br-ff-merge

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
    

    git-no-ff-mode

分支冲突

当两个分支同时对同一个文件进行修改时,在合并时会存在分支冲突,此时需要手动将合并失败的文件修改,然后在add-commit,会自动的将两个分支的文件合并。

git-br-conflict-merged

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  # 删除标签

忽略特殊文件

使用 .gitignore文件

*.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'
posted @ 2020-04-02 19:55  happy_fan  阅读(143)  评论(0编辑  收藏  举报