简单使用git
初始化
git init
: 初始化当前文件夹,会将当前文件夹初始化为一个空的git仓库。
git init
不会清空当前的文件夹,只会在当前目录下创建一个空的.git文件夹,用于记录和管理当前仓库。
git config --global user.name "name"
、
git config --global usr.email "example@email.com"
会将名字和邮箱保存到.git/config
下,这样提交文件的时候就会知道是谁在操作了。
添加.gitignore文件
不会有人希望将文件夹下的所有东西都要传到仓库里,添加.gitignore
就可以过滤掉指定的文件和目录。
使用规则如下:
1 | # 不添加某个文件,例如不想把tmp.txt文件上传到仓库,写上文件名就行了 |
免密登录
ssh-keygen rsa -t [email]
会在用户目录下生成密钥对,将ssh.pub下的公钥复制到对应的仓库就可以免密提交了。
克隆仓库
git clone some.git dir
: 克隆下来别人的仓库到dir文件夹下,如果不指定dir
则会使用仓库的名称来创建一个文件夹。
git log
git log
查看提交历史记录
git log --graph --all
以图的形式显式所有分支的提交历史记录
git branch
git branch
管理分支
git remote
git remote
管理远程
本地仓库
git status
git status
查看当前仓库的状态,可以看到有哪些文件未提交,哪些文件在暂存区。当然也可以指定查看具体某个文件的状态。
git add
使用git add file.*
可以将某个或某些文件添加到暂存区。使用.
会将当前已经修改的文件全部添加到暂存区。
git commit
git commit -m 'message'
将暂存区的文件提交到本地仓库中。
撤销修改
git checkout -- <filename>
会将工作区中已经修改的文件还原成未修改时的状态。
如果暂存区中有该文件,就会用暂存区中的覆盖当前工作区中的内容;如果是新建的文件,暂存区中没有,就会还原成上次提交的状态,也就是直接删除当前文件。
删除文件
git rm [--cached] <filename>
会删除指定的文件,然后再commit就会从本地库中删除掉了;如果只想删除本地库中的文件,而保留工作区中的文件,就要加上--cached
选项。
回退本地库
git reset [--hard] HEAD~1
将本地库回退到HEAD
的上一个版本,HEAD一般指向的是最新的版本,~1
表示HEAD指向的前一个版本。不加--hard
选项,会保留最新的更改;加上--hard
选项,会直接放弃所有的更改,完全回退到指定的版本。
创建和切换分支
git branch
命令可以查看当前所有的分支。
git branch <name>
可以创建一个新的分支。
git checkout <name>
可以切换到一个新的分支上,因为checkout
命令的含义太多了,新的git上可以使用git switch
命令代替来执行切换到新分支这个操作。
也可以使用git checkout -b <name>
或者git switch -c <name>
合并操作创建分支并切换到上面这两步操作,不过没啥必要。
PS:
实际上,使用分支切换时,切换的是
HEAD
指向分支的某次commit
的记录位置,每次在某个分支上commit
时都会创建一个记录位置,这个记录位置就是以当前HEAD
为基准,向后创建一个新版本。如果没有通过switch
或checkout
直接操作HEAD
的话,HEAD
会指向分支的最新的位置,以分支名切换时也是切换到那个分支的最新的记录位置。如果直接操作HEAD
的话,就可以回溯到分支之前的某个位置。
合并分支
git merge <other_branch>
git rebase <other_branch>
merge
会保留所有分支的历史记录,而rebase会将两个分支的历史记录整合成一个,使得历史记录看起来更线性。
在合并过程中出现冲突时,就需要手动进行合并操作。
两者的区别:
merge
会将所有提交合并成一个新的提交,然后提交到当前分支上;rebase
会先寻找两个分支的共同祖先分支,然后将当前分支的提交先搁置,把指定分支的提交合并过来,然后再把当前的分支搁置的提交依次合并上来。
相对正确的做法:自己切出去的分支在完成任务后,先rebase主分支,解决完冲突后再提PR,最后合并到主分支上。
删除分支
git branch -d <name>
删除本地分支
远程仓库
git remote -v
查看远程仓库状态。
添加远程仓库
git remote add <name> <remote-url>
添加远程仓库
推送
git push -u <origin> <branch-name>
推送到远程仓库并绑定到对应的分支
git push [-f] origin <branch-name>
推送到远程仓库并和远程分支合并,添加-f
强制推送
删除远程分支
git push origin :<branch-name>
或者git push --delete origin <branch-name>
。
拉取
git fetch --all
拉取所有远程分支并更新到本地分支
git fetch origin <branch>
拉取一个特定的远程分支
git checkout -b <new-branch> origin/<remote-branch>
在本地建立一个基于远程仓库分支的新分支
git checkout --track origin/<remote-branch>
拉取远程分支并自动与本地分支关联,也可以用git checkout -t origin/<remote-branch>
git pull
拉取并自动合并
远程分支操作
git branch -r <origin/>
查看远程仓库的分支,如果不指定仓库则查看所有远程仓库的分支。
git branch -vv
会列出本地分支和远程分支的关联情况。
如果本地分支和远程分支没有关联,可以使用git branch -u origin/远程分支 本地分支
进行关联,这样就把本地分支和远程分支绑定起来了。
如果绑定错了,还可以通过git branch --unset-upstream 本地分支
取消关联,然后再重新关联。
git branch -r -d 本地分支
会删除掉本地的相关分支,git push origin --delete 远程分支
会删除远程分支。
搭建私服仓库
1. 创建一个裸仓库
git init --bare [name.git]
会创建一个裸仓库,实际上这个就是直接创建了.git文件夹内的文件,此时就是一个裸仓库(没有工作区)。
在hooks文件夹里有些git自带的sample脚本,修改文件名后可以使用,也可以添加一些git操作的脚本,比如创建一个名为post-recerive
的脚本,写上
1 | git clone name.git ~/name |
就会在接收到推送后,将这个仓库克隆到用户根目录的name文件夹下。
写上
1 | git --work-tree=/home/user/xxx --git-dir=xxx.git checkout -f |
就可以为当前的裸仓库指定一个工作区,这句的意思是将某个文件夹作为git仓库文件夹xxx.git
的工作目录,然后通过checkout
强制将分支切上去。主要的用途就是想把仓库中的某个分支里的文件直接放到另一个地方。
hooks脚本可以做更多更强大的事情,这就超出了本文简单使用git的主题范畴了。主要作者本人也不会
2. 克隆仓库
git clone user@ip:path/xxx.git
可以将上一步创建的远程仓库克隆到本地,不再细说。
在克隆的时候如果不指定名称,会默认使用origin作为远程仓库的名称,想要指定别的名称的话,要使用
--origin name
。
3. 建立和关联分支
上一步中在本地克隆下来的是一个裸仓库,里面什么也没有(包括也没有分支),所以需要先创建一个分支(也可以不克隆,在本地也初始化一个空的仓库,然后使用git remote add origin name@xxx.git
来给本地的仓库和远程的仓库建立链接)。
git branch master
在本地创建了一个master
分支,但是远程仓库还没有分支,所以要将本地创建的这个分支也在远程搞一个对应的,可以使用git push -u origin master
或者git push --up-stream origin master
绑定本地的master
分支和origin
的master
分支,并且推送到远程,实现的效果就是在远程创建了一个master分支,并且也和本地实现了关联。
如果远程仓库有master分支,也可以执行git branch -u origin/master master
建立关联。
4. 推送和拉取
到这本地仓库和远程仓库都部署成功了,可以愉快地拉取和推送了。