git init
git add <filename> // 添加单个文件到暂存区
git add <filename> <filename> // 添加多个文件到暂存区
git add . // 这是将全部文件添加到暂存区
git commit -m "本次提交说明"
git status
git diff <filename>
git diff HEAD -- <filename>
git log
git log --pretty=oneline // 带参数,美化显示
在Git中,用
HEAD
表示当前版本,HEAD^
表示上一个版本,HEAD^^
表示上上个版本,如果我们要看前100个版本怎么办?HEAD~100
。所以我们平常使用HEAD~num
就ok
git reset --hard HEAD^ // 回退到上一个版本
git reset --hard HEAD^^ // 回退到上上个版本
git reset --hard HEAD~1 // 回退到上一个版本
git reset --hard 版本号 // 回退到指定版本
当我们将版本回退到前一个或者前n个版本后,又想回到当前最新的版本怎么办?使用
git reset -- hard
版本号。但是,我们通过git log
显示提交日志,我们发现最新的那个版本已经不在了,那么怎么才能找到原来最新的那个版本号呢?git reflog
,它会记录下来我们操作的记录,就可以知道我们那个版本号是什么了。
cat <filename>
git reflog
工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master的一个指针叫HEAD
。
前面我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
当我们将暂存区的内容提交到分支上时,暂存区就会边为空。
文件修改后,想直接丢弃工作区里修改的内容。
git restore <filename>
或
git checkout -- <filename>
在此操作是存在两种情况:
1.文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2.文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
如果修改的文件已经被“add”到了暂存区
git restore --staged <filename>
可以将暂存区的修改撤销
git restore --staged <filename>
使用
git restore --staged <filename>
撤销修改后git status
查看文件状态,暂存区的修改以撤销,工作区有修改,接着使用git checkout -- <filename>
撤销工作区的修改即可。
在本地删除了文件之后,想要删除版本库对应的文件,那么,我们使用
git rm/add <filename>
删掉版本库的内容,再git commit -m "remove
文件",这样就彻底删除了。
git rm/add <filename>
git commit -m "remove filename"
如果是误删,想要恢复的话,那么我们可以使用
git restore <filename>
或者git checkout -- <filename>
来恢复工作区的文件。注意,从来没有添加到版本库的就被删除的文件,是不可以恢复的。
git restore <filename>
或
git checkout -- <filename>
git remote add origin git@github.com:dongxinhua/<filename>.git
git push -u origin master
以后再次提交的话,只需要:
git push origin master // 推送到主分支
git push origin <branch name> // 推送到其他分支
git clone git@github.com:dongxinhua/<filename>.git
git branch <branch name>
git checkout <branch name> // 语义不好建议使用switch
git switch <branch name> // 建议使用
git checkout -b <branch name> // 语义不好建议使用switch
git switch -c <branch name> // 建议使用
带*的代表当前分支
git branch
git branch -a // 查看所有分支
git branch -r // 查看远程分支
这种方法是
Fast forward
模式,让master直接指向分支,合并完成后,甚至可以删除分支
git merge <branch name>
如果想要强制禁用
Fast for word
模式,这样Git就会在merge时生成一个新的commit,这样咋在分支历史上就可以看到分支信息。
git merge --no-ff -m "merge with no-ff" <branch name>
// 先建立本地分支
git switch -c <branch name>
// 将新分支推送至GitHub.
git push origin <branch name>
git branch -d <branch name>
git branch -D <branch name>
当两个分支各有修改,然后
git merge <branch name>
就会报错,提示两个各有修改,然后,我们查看文件的内容,可以看到冲突的地方,然后我们把那一段符号和文字改为我们最终想要修改的内容。再进行提交,并查看分支合并的情况git log --graph --pretty=oneline --abbrev-commit
然后就合并成功了。
Git
提供了一个stash
(储藏)功能,可以把工作现场储藏起来,等以后恢复现场后继续工作
git stash
git stash list
git stash apply
再删除工作现场
git stash drop
git stash drop
git stash pop
git stash apply stash@{number}
git remote
git remote -v // 查看详细信息
首先,可以试图用
git push origin <branch name>
推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch name> origin/<branch name>
。
查看远程库信息,使用
git remote -v
;
从本地推送分支,使用git push origin <branch name>
,如果推送失败,先用git pull
抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b <branch name> origin/<branch name>
,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream <branch name> origin/<branch name>
;
从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突。
//先切换到需要打标签的分支上
git switch <branch name>
git tag <tag name> // 再打tag 例如git tag v1.0
git tag -a <tag name> -m "描述内容" <commit id> // 创建带有说明的标签
git tag
git show <tag name>
如果我们忘记了打标签,但是已经过去了好久,怎么办呢?
我们先通过git log --pretty=oneline --abbrev-commit
查询历史提交的commit id
然后找到我们要打tag的那个commit 通过git tag <tag name> <commit id>
来打tag
注意, 标签不是按照时间顺序列出的,而是按字母排序的。可以用git show <tag name>
来查看标签信息
用命令git tag -a <tag name> -m "描述内容" <commit id>
可以创建带有说明的标签
git tag -d <tag name>
git push origin <tag name>
git push origin --tags
想要删除远程的标签
1.先删除本地的git tag -d <tag name>
2.从远程删除git push origin :refs/tags/<tag name>