简单使用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就可以过滤掉指定的文件和目录。
使用规则如下:

# 不添加某个文件,例如不想把tmp.txt文件上传到仓库,写上文件名就行了
tmp.txt

# 支持正则表达式,下面这个就可以排除所有的可执行文件
*.exe

# 排除整个文件夹,例如下面这样会排除build文件夹
build/

# 如果想忽略某个文件,而不要影响其他同名文件,可以指定路径,如下会忽略根目录下的doc文件
/doc

# 还可以指定不忽略哪些文件,在前面添加!即可,如下,表示不忽略conf文件
!conf

免密登录#

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为基准,向后创建一个新版本。如果没有通过switchcheckout直接操作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的脚本,写上

git clone name.git ~/name

就会在接收到推送后,将这个仓库克隆到用户根目录的name文件夹下。
写上

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分支和originmaster分支,并且推送到远程,实现的效果就是在远程创建了一个master分支,并且也和本地实现了关联。
如果远程仓库有master分支,也可以执行git branch -u origin/master master建立关联。

4. 推送和拉取

到这本地仓库和远程仓库都部署成功了,可以愉快地拉取和推送了。

作者:cwtxx

出处:https://www.cnblogs.com/cwtxx/p/18718198

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   cwtxx  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示