俗话说好记性不如烂笔头,此篇用来记一下常用的命令和一些操作,以后碰到啥问题也都放上来,前面的是跟着廖雪峰的教程过的。
我的mac和阿里云服务器都带git,所以安装啥的就不说了git官网地址:https://git-scm.com/ 各位可以自己去看一下。
创建一个本地仓库
创建一个版本库:首先选择一个合适的地方,创建一个空目录:
1
$ mkdir studygit
然后进入这个目录并通过git init命令把这个目录变成git可以管理的仓库:
1
2
3$ cd studygit
$ git init
Initialized empty Git repository in...添加文件到仓库
首先新建一个文件并添加文字内容:1
2
3$ touch helloworld
// 我这是mac,各位根据自己的系统考虑要不要这个
$ vi helloworld添加文字”hello world!”然后保存。将文件添加到git仓库:
1
2$ git add helloworld
// $ git add . 提交所有修改文件不包括删除的文件然后用git commit告诉git,把文件提交到仓库。
1
$ git commit helloworld -m "init"
-m后面的是本次提交的说明
版本控制相关
接着上面的来,现在修改helloworld中的内容,增加一行文字hello git
- 使用git status查看状态:
1 | $ git status |
- 使用 git diff对比文件:
1 | $ git diff hello world |
接着add 和 commit 与之前的一样,不再赘述。
- 查看历史记录:git log
1 | $ git log |
- 将helloworld回退回上个版本:
在git中,用HEAD表示当前版本,上个版本就是HEAD^,上上个HEAD^^,100个版本前,HEAD~1001
2$ git reset --hard HEAD^
HEAD is now at 13cc7ca init
这个时候虽然回退到了上个版本,但是git log也看不到上一次的提交记录了,不过如果你记得上次提交的版本号,依然是可以恢复的。
- 回到回退之前的版本:
1
2$ git reset --hard 03c3d76e1f6b405af5ca9d9c2268b1ff120d601e
HEAD is now at 03c3d76 add some words
查看commit id:
1
2
3
4
5$ git reflog
03c3d76 HEAD@{0}: reset: moving to 03c3d76e1f6b405af5ca9d9c2268b1ff120d601e
13cc7ca HEAD@{1}: reset: moving to HEAD^
03c3d76 HEAD@{2}: commit: add some words
13cc7ca HEAD@{3}: commit (initial): init恩,事实上我上面写那么长的id根本没有必要,不过就吓吓自己,不要瞎动东西。。。
撤销修改
在helloworld中新增一行:a ha?
1 | $ git checkout -- helloworld |
上面是没有使用git add命令的撤回修改,使用了该命令的撤销修改:
1 | $ git reset HEAD helloworld |
此时已经把暂存区的修改回退到工作区,接着和上面一样,丢弃工作区的修改。
1 | $ git checkout -- helloworld |
- 删除文件
在git仓库中新建一个文件并提交,接着使用rm命令删除,这时使用git status命令查看:
1 | $ git status |
如果确实要从版本库中删除该文件,使用git rm删掉,并且commit:
1 | $ git rm test |
如果是删错了,恢复:
1 | git checkout -- test |
远程仓库
双十一的时候买了一台阿里云服务器,就用这个折腾一下吧。
首先还是一样的,创建一个studygit目录。
1 | # mkdir studygit |
然后初始化
1 | # git init |
创建一个hello文件,并写入hello字符
1 | # vi hello |
将hello加入git仓库
1 | # git add hello |
之后再我自己的终端使用clone命令
1 | $ git clone git@xxx:/studygit/.git |
其中xxx是服务器ip,我现在比较菜= =不知道能不能暴露,先不写上来了
使用ls命令看看有没有clone下来:
1 | $ ls |
进入该studygit,也就是clone下来的仓库查看hello文件是否有hello字符
1 | $ cd studygit |
clone问题不大,在push的时候我碰到了一些问题,由于我现在不是非常的懂Linux,所以暂时不详细的讲,只把现象和我暂时找到的解决方法写上来。
1 | $ git push git@xxx:studygit/.git |
主要是因为权限问题,我不是很了解Linux中的权限和git权限之类的,暂时先放着,只放上我看到的其中一个我试了可以,而且比较简单的方法和他的解释:
这是因为git服务器端对应git仓库目录的访问权限问题,如果一定要多用户访问git仓库,可以设置一个gituser组,给他分配足够的权限即可。
1 | # chgrp -R gituser path/to/gitrepo |
第三个大概是要root权限的,777好像是简单粗暴了点,不过我现在不是非常的了解。
继续push还是会错:
1 | Could not chdir to home directory /home/git: No such file or directory |
因为我们使用git init初始化的远程仓库,默认情况下git是拒绝push操作的,需要修改配置在git服务器端对应的git仓库的配置文件。在.git/config文件中增加如下配置:
1 | [receive] |
最终终于push成功了!
1 | Could not chdir to home directory /home/git: No such file or directory |
多人合作
新建dev分支
1 | $ git branch dev |
切换到dev分支
1 | $ git checkout dev |
查看远程仓库
1 | $ git remote -v |
查看远程分支
1 | $ git branch -a |
将本地分支push到远程分支
1 | $git push origin local_branch:remote_branch |
这个操作,local_branch必须为你本地存在的分支,remote_branch为远程分支,如果remote_branch不存在则会自动创建分支。
类似,git push origin :remote_branch,local_branch留空的话则是删除远程remote_branch分支。
取回远程主机某个分支的更新,与本地的指定分支合并
1 | $ git pull <远程主机名> <远程分支名>:<本地分支名> |
删除远程分支:
1 | $ git push origin --delete <branchName> |
删除tag:
1 | git push origin --delete tag <tagname> |
合并commit,在各种情况下,我们都有可能在代码没有完全完成的情况下提交commit,可以利用rebase命令合并commit:
1 | $ git rebase -i commitid |
commitid是最新一次commit的id
杂记
git配置用户名和邮箱:
1 | $ git config --global user.name [your name] |
查看远程仓库
1 | $ git remote -v |
记一次从暂存恢复代码的经历
一天上班的时候用git stash暂存了代码,后来有事出去了,第二天来的时候代码都没了,哇,真的绝望,因为重写一遍怪麻烦的。当然了,转念一想,我用git应该会有恢复的办法,上网搜了一下,果然有。首先用git stash list看一下历史
1 | $ git stash list |
前面的0、1啥的表示下标,看到这个,就感觉稳了,恢复有望。
后来用了如下的命令恢复了代码:
1 | $ git stash pop --index |
–index表示不仅恢复工作区,还恢复暂存区,后面可以跟参数恢复指定的记录。我这里没有指明默认恢复最新记录。
小记:最近切换分支,切换回来的时候发现stash的内容没了,那这可能就是他工作的方式,不同于commit,stash就是需要我们自己选择一个恢复过来。可以用如下命令:
1 | $ git stash apply stash@{1} |