Workspace:工作区
程序员进行开发改动的地方,是你当前看到的,也是最新的。
平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
Index / Stage:暂存区
.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。
当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。
Repository:仓库区(或本地仓库)
保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些
git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步
Remote:远程仓库
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的
=================================================================
#git用户名
git config --global user.name "your name"
#邮箱
git config --global user.email "[email protected]"
#显示颜色
git config --global color.ui true
mkdir project
cd project
git init #创建全新的仓库,在当前目录初始化创建仓库
git clone 'https://github.com/kwonganding/KWebNote.git' # 克隆远程仓库
git add my.java
#git add -f my.java f为强制添加
git add <dir> 添加指定目录到暂存区,包括子目录
git add <file> 添加指定文件到暂存区
git add . 添加当前目录所有文件到暂存区
git rm [file1][file2]... 删除工作区文件,并且将这次删除放入暂存区
git mv [file-original][file-renamed] 改名文件,并且将这个改名放入暂存区
git commit -m "提交备注"
git commit <file> -m <message> 提交暂存区的指定文件到本地仓库
git commit --amend -m <message> 使用一次新的commit,替代上一次的提交
git status
git diff my.java
git log
git reset —soft <commit> #只改变提交点,暂存区和工作目录的内容都不改变
git reset —mixed <commit> # 改变提交点,同时改变暂存区的内容
git reset —hard <commit> #暂存区、工作区的内容都会被修改到与提交点完全一致的状态
git reset --hard HEAD # 让工作区回到上次提交时的状态
git reset --hard HEAD~N
git reset --hard e475afc93c209a690c39c13a46716e8fa000c366 (此值不必写全,只要能让git知道是哪个把那本就行,一般写5-6位即可)
revert与reset的区别
git revert用一个新提交来消除一个历史提交所做的任何修改
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,减少冲突。但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入,产生很多冲突
git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容
git checkout -- my.java #撤销到最近一次git add 或 git commit之前的状态
git reset HEAD my.java #撤销暂存区的修改,git commit之前
git rm my.java #若误删,需要git checkout --文件名
git remote -v
git remote add origin [email protected]:username/xxx.git
git branch 分支名 #新建一个分支,但依然停留在当前分支
git checkout 分支名 # 新版本 git switch 分支名 切换到指定分支,并更新工作区
git checkout -b 分支名 # 新版本 git switch -c 分支名 新建一个分支,并切换到该分支
git branch --track <branch><remote-branch> # 新建一个分支,与指定的远程分支建立追踪关系
git fetch <remote> # merge之前先拉一下远程仓库最新代码
git merge 其他分支名 #合并某分支到当前分支,若存在冲突会提示手动修改后在提交(默认为fast forward模式)
git merge --no-ff -m "提交备注" 其他分支名 #禁用fast forward模式
git log --graph --pretty=oneline --abbrev-commit 命令可以查看分支合并图
git branch #查看分支
git branch -a # 远程+本地 远程分支会以红色标出,当前分支前面会标一个*号
git branch -r #列出所有远程分支
git branch -d 分支名 #删除分支
git branch -D 分支名 #强行删除分支
git push origin --delete <branch-name> #删除远程分支
rebase与merge的区别
两个分支,test和master,提交如下:
D—E test
/
A—B—C—F master
在master执行git merge test,然后会得到如下结果:
merge操作会生成一个新的节点,之前的提交分开显示,如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使用git merge
D--------E
/
A—B—C—F----G test, master
在master执行git rebase test,然后得到如下结果:
rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交,如果你想要一个干净的,没有merge commit的线性历史树,那么你应该选择git rebase
A—B—D—E—C’—F’ test, master
git push -u origin master # 第一次推送到master分支
git push <remote><branch> #上传本地指定分支到远程仓库
git push <remote> --force #强行推送当前分支到远程仓库,即使有冲突
git push <remote> --all #推送所有分支到远程仓库
git push origin 分支名 #推送到指定分支
git branch --set-upstream-to 分支名 origin/分支名
git remote add github [email protected]:username/xxxx.git
git push github master
git remote add gitee [email protected]:username/xxxx.git
git push gitee master
git rebash # 在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git clone https://github.com/username/xxxx.git # 或 git clone [email protected]:username/xxxx.git
git clone -b 分支名 https://github.com/username/xxxx.git
git pull
=========================================================================
git stash
git stash list
git stash apply
git stash apply stash@{n} # 若存在多个保存的工作空间(n为序号0开始)
git stash drop
git stash drop stash@{n} #若存在多个保存的工作空间()
git stash pop #从保存的工作空间恢复兵删除保存的空间
git stash pop stash@{n} #若存在多个保存的工作空间(n为序号0开始)
git cherry-pick commit的编号
============================================================
git tag v1.0 commit的id #(不加则为之后的commit添加标签)
git tag -a v1.0 -m "提交备注" commit的id #(不加则为之后的commit添加标签)
git tag
git show v1.0
git tag -d v0.1
git push origin :refs/tags/v1.0
git push origin v1.0
git push origin --tags
=================================================
git check-ignore -v 文件名
git config --global alias.st status # git status => git st
git config --global alias.unstage 'reset HEAD' # git reset HEAD file => git unstage
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" # git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit => git lg
==================================================================
TortoiseGit
小乌龟,SVN时代就很流行的代码管理GUI利器,Git是集成到操作系统里的,直接右键文件夹就可以进行Git操作了。
只有Windows版本,支持中文,需要单独下载安装中文语言包。
✔️开源,免费,与文件管理器的良好集成。
✔️内置冲突对比解决工具。
Sourcetree
SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。
✔️适用于 Windows 和 Mac 系统,内置中文版,自动识别语言。
✔️免费、功能强大,使用简单。
✔️功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手,支持Git Flow。
无冲突对比工具,支持配置第三方组件。
GitHub Desktop
Github官方出品的Git管理工具。
GitKraken
GitKraken是一个跨平台GUI Git客户端,有免费版,专业版和企业版,这些版本启用了不同的功能。