首先理解git分为工作区,暂存区,本地仓库,远程仓库
Git目录下的文件有四种状态:Unmodify(未修改)、Modified(已修改)、Staged(暂存)和Committed(已提交)
git status能看到三种文件状态
- Untracked files 未跟踪 指从未添加到本地仓库的文件。
- Changes not staged for commit 未提交的更改 当前文件在工作区有修改,但是没有提交到暂存区。
- Changes to be committed 提交的更改 当前文件提交到暂存区了未commit到本地仓库。
还有一种就是被ignore的文件是不会显示的(在.git目录下创建.gitignore文件指定忽略文件或目录)。
工作区:
一般下载代码用
git clone https://github.com/cesanta/mongoose.git
命令从远程仓库下载代码默认master分支
git clone https://github.com/cesanta/mongoose.git --branch=xxx --depth=1
命令中--branch用于指定分支, --depth用于代码量过大下载失败,设置只包含最近日志。
修改文件后都是保存在工作区的。使用git status查看文件号状态,一般会显示为红色
可以使用git diff查看工作区文件的修改。
使用git checkout 指定目录或文件,删除本地文件(工作区)修改(慎重使用,如果该修改未提交过commit,则不可以恢复)
暂存区:
可以使用git add code/src/main/main.c 命令执行目录或文件将状态提交到暂存区。
git add . 表示将Untracked files和Changes not staged for commit状态的文件都提交到暂存区
git add -u . 命令表示将当前目录状态为Changes not staged for commit提交到暂存区(-u 表示已跟踪文件,. 表示所有文件)
git status查看文件状态
可以使用git diff --cached 查看暂存区文件的修改。
可以使用git reset code/src/main/main.c指定文件或目录将文件状态撤回到工作区
git reset . 撤回所有暂存区的所有文件。
本地仓库:
使用git commit提交暂存区的文件到本地仓库,然后生成一个commit提交。可以使用git log查看本地仓库的commit。
已经执行了commit,但是日志描述不正确想重新填写,可以执行git commit --amend修改最近的一次commit。
如果是更之前的commit可以配合git reabse -i去使用。
要将commit撤回,可以使用git reset commit号,可以回退本地仓库本次commit提交, 并将相关修改放在工作区。
git reset --hard commit号,将本地仓库状态回退到对应状态,并丢弃相关修改到工作区和索引区。
git reset --soft 将head移动到指定提交,但不会改变本地仓库状态,主要用于提交部分修改到远程仓库时使用。
commit号可以改为HEAD·n n表示数字,表示最近的n个commit。
远程仓库;
使用git push 将本地仓库推送到远程仓库,如果与远程仓库已经同步,可以直接push成功,否则失败。
不同步需要先同步远程仓库到本地仓库。使用git pull命令,将远程仓库同步到本地仓库然后merge到工作区。如果merge失败,需要先解决冲突然后再执行git pull,直至成功合并。
再次执行git push可以推送成功,
git push -f 表示强制将本地仓库推送到远程仓库,风险极大,可以抹除远程仓库上提交记录(前提是无审核机制)
/****************************************************************************************************/
使用小技巧:
1.可以使用git branch查看当前有多少个分支,使用git branch aaa创建一个aaa的分支,使用git checkout aaa将代码切换到aaa的分支。这种好处在于,在aaa分支修改文件后,将修改提交到本地仓库,形成一个新的commit,再切回之前的分支,是没有这个修改的(前提要执行到commit)。修改还在工作区,暂存区,这块修改是分支间共享的,只有提交commit后,才会在该分支有记录。当你需要提交到远程仓库时,先更新与远程仓库对应的分支代码,然后用切换到该分支,用git merge aaa将修改合并,如果有冲突需要手动修改后add进本地仓库。
2.如果下载代码用的git clone --branch==xxx --depth=1,想要消除--depth可以使用git pull --unshallow命令,执行后可以看到完整的commit。
如果想本地有远程仓库中别的分支代码可以使用这几条命令指定分支。
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name
3.如果你发现了自己的最近某个提交有问题,想撤回但是要留有记录,可以执行git revert commit号,会产生一个revert记录,可以直接git push到远程仓库。如果不想产生一个revert记录,可以使用git rebase对历史提交做修改,但是不建议这样做,这样修改能让历史记录非常好看,但是也会抹除部分提交记录。
4. 如果不小心用git push -f提交远程代码并且把同事的提交给覆盖了,此时如果你本地提交前git pull过,有完整的提交记录。直接使用git log是不行的,可以使用 git reflog 找到你git pull时的提交,执行git reset --soft HEAD@{8} 选对应pull时的数字。然后再执行git push -f覆盖你之前的错误提交。(风险大,可以自己搞个独立远程仓库分支尝试)。如果本地没有就得找到最后一个提交代码的同事让他git push -f更新一下远程仓库。