经过一年,终于熟练使用最基本最基本的几个命令了。当初看了三四遍文档,不知道为什么就是想不太明白==工作中又不用。
如果你是一个超级初学者,也像我一样怎么也想不明白,可以在日常工作中遵循以下步骤:
- 打开github创建一个repository
- 复制git地址
git clone
地址到本地文件夹- 把你写的代码扔进去
git add *
git commit -m "写点心情文字"
git pull
(很重要,有事没事多pull)git push origin master
(或者其他分支)
就靠这几个步骤度过不会git的艰难日子。另外有些命令是让我毫无痛苦就记住的:
git status
:查看下还有没有未提交的文件==
git reset --hard ...
: 万一写错了,就把本地的文件重置为服务器上的文件
git checkout newbranch
: 切换分支
除此之外,回退什么的我不敢轻易使用==就这么撑过了一年。
进阶
git reset
最近发现有个命令我常用。本地commit之后,还没push,后悔了,想要回到当初没有commit(xiangai)的时刻
git reset --hard commit_id
git reset HEAD~1
//`HEAD`表示当前版本
//~1 是之前的一步,~2是之前的两步……
然后可以重新git add, commit, pull push……
使用reset可以在不同的版本之间穿梭,如果回退到过去的某个版本,又想回到现在的某个版本,都是通过commit_id来进行的。可以使用git reflog来查看所有的commit_id。其实就是把HEAD指针指向到不同的commit_id, HEAD始终指向的是当前的commit
git diff
git status 可以轻松知道有哪些文件修改了
git diff 某个文件, 可以让我们知道某个文件具体修改了什么内容
git diff HEAD – 文件名 可以查看文件工作区和版本库里最新版本的区别
git log
查看最近的3条提交commit日志
想要显示简洁的commit id信息,加上参数 --pretty=oneline
git reflog
记录每一次命令的
git的两个区
工作区(Working Directory):在电脑里看到的文件
版本库(Repository): .git里面的文件,版本库。包含两个区:
—— 暂存区 Stage
—— HEAD 指向的是不同分支的内容
假想你是一个外太空医生,在地球生活,偶尔去外太空出诊。
每天你在地球上工作(地球是你的工作区),准备的差不多了,乘坐git add巴士,带着准备好的药品先去中转站(暂存区Stage),commit spaceship 带着暂存区的所有人前往月球,月球就是我们一个分支。
总之,通过git add,文件从工作区移动到了暂存区,通过git commit 文件从暂存区移动到了分支。git status查看的便是工作区的内容,
git checkout
git checkout – file 丢弃工作区的修改, 回到最近一次git commit或git add时的状态。
按照顺序,如果暂存区有状态,那就是暂存区的状态,如果没有,那就是版本库的状态。
如果没有–file, 那就是切换分支
git checkout -b feature1 创建并切换分支
git merge
git merge newbranch 合并分支
git branch -d newbranch 删除分支
git merge –no-ff -m “merge with no-ff” dev
不是用fastforward模式进行合并,合并后可以看出合并迹象,如果使用了fast-forward模式,看不出来曾经做过合并
git reset revert checkout 区别?
Reference stackoverflow Link
- revert 会创建一个新的commit来撤销上次的commit,已有的记录并不会被改变;如果你commit,然后觉得这个commit很失败,想要撤销
- checkout是把区域2仓库的内容移到区域1 working directory中,也不会改变已有记录;如果你没有commit,想要撤销
- reset 会修改暂存区stage,head的指向也会变,已有的记录改变;如果你在本地commit了
git rm
git rm file
删除版本库的文件,相对于命令git add
git commit -m "remove test.txt"
提交删除操作
git checkout -- test.txt
误删恢复
git stash
切换分支前,暂存当前的工作,做完别的回来之后,可以恢复
git branch
创建了一个新分支,还没合并到主分支,结果想要删掉这个分值。
git branch -d feature-vulcan
不生效
git branch -D feature-vulcan
强制删除
git remote
git remote -v
查看远程更详细的信息
关联远程库
如果先有本地库,后有远程库,就不能用clone那一套了
git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容
创建SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
本地Git仓库和GitHub仓库之间的传输是通过SSH加密。
运行成功后,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
标签
标签是版本库的一个id,你可能会有多个commit,标签指向某个commit,因为commit_id很难记住,而tag可以像v1.2之类的被记住
- git checkout master 切换分支
- git tag v1.0 打标签
git tag 可以查看所有的标签。标签不是按时间顺序列出,而是按字母排序的
默认标签是打在最新提交的commit上的,通过 git log --pretty=oneline --abbrev-commit
找到历史的commit id, git tag v0.9 6224937
可以打在某个具体的commit操作上
另:
git tag -a v0.1 -m "version 0.1 released" 3628164
创建带有说明的标签,用-a指定标签名,-m指定说明文字
git show <tagname>
可以看到说明文字:
git tag -d v0.1
删除标签
git push origin <tagname>
推送标签到远程
git push origin --tags
一次性推送全部尚未推送到远程的本地标签
已经推送到远程?先从本地删除:git tag -d v0.9
然后,从远程删除。git push origin :refs/tags/v0.9
Fork
fork就是在自己的仓库下复制别人的仓库。这样你才有权限推送。如果想在别人的仓库提交自己的推送,使用pull request
color
git config --global color.ui true
命令行颜色
gitignore
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
举例
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
git add -f App.class
如果文件被忽略,仍旧想要提交
git check-ignore
可以检查哪个规则写错了