创建版本库
mkdir repo
cd repo
git init
git add readme.txt
git commit -m "text for read"
简单的设置
git config --global user.name "xiaoming"
git config --global user.email "xiaoming@school"
git config --global color.ui true
版本操作
git status
git diff readme.txt
git log
git log --pretty=oneline
git reset --hard HEAD^ #回到上一个版本
git reset --hard HEAD^^ #回到上上一个版本
git reset --hard HEAD~100 #回到上一百个版本
git reset --hard 1345212 #回到指定的版本
git reflog #记录每一次命令
git checkout -- filename #:改乱了工作区,或者想丢弃工作区的修改时
git reset HEAD filename #:改乱了内容,还添加到了暂存区,回到上一条命令的场景,重新放回工作区
版本回退:提交了不合适的修改到版本库(未提交到远程库)
删除文件
git rm test.txt
git commit -m "remove file"
git checkout -- test.txt #删错文件恢复
远程版本库
1、创建一个远程Git仓库
2、按照提示做
# 添加后远程库的名字就是origin, 可以改为别的
git remote add origin git@github.com:GodsLeft/zhu_repo.git
# 本地库的所有内容推送到远程库上,-u把本地的master分支内容推送到远程
# 新的master分支,还会把本地的master分支和远程的master分支关联起
# 来,以后简化命令
git push -u origin master
git push origin master: 使用了-u之后,以后就这样
克隆远程版本库
git clone git@github.com:GodsLeft/gitskills.git
分支
git branch #查看分支
git branch name #创建分支
git branch -d name #删除分支
git checkout name #切换分支
git checkout -b name #创建 + 切换分支
git merge name #合并某分支到当前分支
分支冲突,修改之后再提交
# 查看分支图
git log --graph --pretty=oneline --abbrev-commit
#合并分支的时候使用的是Fast forword,这种模式,删除分支后会丢掉分支信息
//如果强制禁用,就会在merge时生成一个新的commit,这样从分支历史上就可以看出分支信息
git merge --no-ff -m "merge with no-ff" dev
bug分支
git stash #存储当前工作现场
git checkout master #切换到主分支
git checkout -b issue-101 #从master创建临时分支
git add readme.txt
git commit -m "fix bug 101" #修复bug并提交
git checkout master #切换到master分支
git merge --no-ff -m "merged bug fix 101" issue-101 #合并分支
git branch -d issue-101 #删除分支
git checkout dev #切换到原来dev分支
git stash list #查看工作现场
git stash apply #恢复现场,但是不删除stash内容
git stash drop #删除stash内容
git stash pop #恢复并删除stash内容
git stash apply stash@{0} #可以多次stash,恢复的时候,使用git stash list查看,回复指定的stash
git branch -D Name #强行删除未合并过的分支
多人协作
git remote #查看远程库信息
git remote -v #更详细信息
git push origin branch-name #从本地推送分支
git pull #如果推送失败,先抓取远程新的提交
git checkout -b branch-name orgin/branch-name #在本地创建和远程分支对应的分支
git branch --set-upstream branch-name origin/branch-name #建立本地分支和远程分支关联
标签管理
git branch #查看分支
git checkout master #切换到要打标签的分支上
git tag v1.0 #打一个标签,标签默认打到新提交的commit上的
git tag #查看所有标签
git log --pretty=oneline --abbrev-commit #查看历史
git tag v0.9 commit-id #对历史版本打标签
git show v0.9 #查看标签信息
git tag -a v0.1 -m "version 0.1 released" 66763723 #创建带有说明的标签
git tag -d v0.1 #删除标签,创建的标签都之存储在本地,不会自动推送到远端
git push origin v1.0 #推送标签到远程
git push origin --tags #一次性推送尚未推送的标签
git tag -d v0.9
git push origin :refs/tags/v0.9 #如果标签已经推送,删除
忽略文件
在git工作区根目录下创建一个.gitignore文件,写入要忽略的文件名
提交.gitignore
配置别名
git config --global alias st status :配置别名
–global :是针对当前用户起作用的,如果不加,只针对当前仓库起作用
.git/config :每个仓库的配置文件都放在这里
~/.gitconfig :当前用户的Git配置文件
配置别名(alias)可以直接修改这个文件,改错了可以删掉文件重新通过命令配置
几个概念
- 工作区:在电脑中能看到的目录
- 版本库:.git 不是工作区,而是Git的版本库。其中最重要的就是stage暂存区,Git为我们自动创建的第一个分支master,以及一个指向master的HEAD指针
其他
# 强行移动分支
git branch -f master HEAD~3
# 撤销变更
## git reset
- 变更还在,只是处于未加入暂存区的状态
- 对远程分支是无效的
## git revert
- 会创建一次新的提交,与当前的父提交是一样的,然后推送到远程,大家共享
# git cherry-pick
将c2 c4这两次提交放到当前的分支上
git cherry-pick c2 c4
# git rebase -i HEAD~2
git rebase branch1 branch2
branch1 作为 branch2 的 base
git tag v1.0 c1
git describe
# 只更新本地的远程分支
git fetch(单纯的下载操作)
- 从远程仓库下载本地仓库中确实的提交
- 更新远程分支指针
git pull == git fetch + git merge
如果要更新远程的代码库
需要合并自己的分支到最新的代码库,然后push
git fetch
git rebase/merge
git push
git pull --rebase == git fetch + git rebase
# 在推送远程分支是不建议使用 merge 但是没有提交历史
当你克隆的时候Git会为远程仓库中的每个分支在本地仓库中创建一个远程分支(o/master)
# 使其他分支跟踪远程的origin/master分支
git checkout -b totallyNotMaster o/master
git branch -u o/master foo
git push origin(远程) master(本地分支)
git push origin foo
git push origin <source>:<destination>
git fetch origin foo