zl程序教程

您现在的位置是:首页 >  工具

当前栏目

git 常用操作

Git 操作 常用
2023-09-11 14:19:29 时间

        Git 是一个分布式版本控制系统,用于项目开发中的版本控制。从本质上来讲Git是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。

         Git的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。Git管理的项目工作目录下的每一个文件只有这两种状态:已跟踪或未跟踪。

  • 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。

  • 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。

  • 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

        Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,Git会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。不仅如此,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。

        Git将项目的存储分为4部分,每部分有自己作用,见下图所示:

0.创建Git仓库

$git init # 命令用于在目录中创建新的 Git 仓库。

在目录中执行 git init 就可以创建一个 Git 仓库了。

例如我们在当前目录下创建一个名为 runoob 的项目:
$ mkdir runoob
$ cd runoob/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 初始化空 Git 仓库完毕。

# 现在你可以看到在你的项目中生成了 .git 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。

1.配置用户名

要在此计算机开始使用Git,必须输入已经认证的用户名。用户名和电子邮件地址应与你在GitLab中使用的一致。

# 1.In your shell, add your user name:
$ git config --global user.name "your_username"

# 2.Add your email address:
$ git config --global user.email "your_email_address@example.com"

# 3.我们要求 Git 版本 1.9.5 以上,这一条设置的 push 方式,只是建议,一般可不设置
$ git config --global push.default simple  

# 4.让Git不要管Windows/Unix换行符转换的事
$ git config --global core.autocrlf false    

# 5.设置大小写敏感 
$ git config --global core.ignorecase false   

# 6. To check the configuration, run:
$ git config --global --list

# --global选项告诉Git,无论您在系统上做什么,都要始终使用这些信息。
# 如果省略--global或use--local,则配置仅适用于当前存储库 current repository

2.建立连接(credential)

配置SSH KEY
配置SSH Key主要是为了允许您的计算机和Code代码平台之间建立安全连接。

启动的Git中输入如下命令来生成ssh key:

$ ssh-keygen -t rsa -C "电子邮箱地址"

这个指令会要求你提供一个位置和文件名去存放键值对和密码,你可以点击Enter键去使用默认值。

用以下命令获取你生成的公钥

$ cat ~/.ssh/id_rsa.pub

复制这个公钥放到你的个人设置中的SSH Keys下,请完整拷贝从ssh-开始直到你的用户名和主机名为止的内容。
如果打算拷贝你的公钥到你的粘贴板下,请参考你的操作系统使用以下的命令:

$ clip < ~/.ssh/id_rsa.pub # windows

打开Code平台SSH KEY设置页面,直接将公钥粘贴到输入框中

3. 克隆代码

# 默认克隆项目的主分支 master,其他分支并没有被克隆到本地
$ git clone https://gitlab.com/gitlab-tests/sample-project.git

$ git clone git@github.com:geometryolife/gld.git

4. 查看分支

$ git branch #查看本地分支
$ git branch -r #查看远程分支
$ git branch -a #查看所有分支
$ git branch -vv #查看本地分支及追踪的分支

5. 创建分支

$ git branch newbranch #创建本地分支newbranch

$ git checkout -b newbranch  #创建并切换到新的分支.
这个命令是将git branch newbranch和git checkout newbranch合在一起的结果。

#将本地分支push, 就创建了远程分支
$ git branch newbranch #创建本地分支newbranch

#创建并切换到新的本地分支.(前提是本地没有这个分支)
$ git checkout -b newbranch  
这个命令是将git branch newbranch和git checkout newbranch合在一起的结果。
#将本地分支push, 就创建了远程分支

# checkout远程的dev分支,本地创建名为dev分支,并切换到本地的dev分支
$ git checkout -b dev origin/dev #(举例)

# 1.先拉取一个指定仓库中主分支到本地同名分支
$ git clone git@github.com:geometryolife/gld.git
# 进入项目的根目录
cd gld
# 默认克隆项目的主分支,其他分支并没有被克隆到本地
# 2.现在想再次拉取一个分支emm
$ git branch -a  #查看所有分支
# 3. 拉取另外一个远程分支到本地同名分支emm,同时切换到emm分支
$ git checkout -b emm origin/emm
# 再次查看,emm 分支已经被拉取下来了,同时也切换到了 emm 分支
git branch -a

6. 切换分支

#切换本地分支
$ git checkout  branchname 

# 切换远程分支
# 该命令可以将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来。
# 并切换到新建的本地分支中。
$ git checkout -b dev origin/dev 


# 放弃所有工作区的修改
$ git status  # 比如查看工作区有两个被修改的文件
$ git checkout .  # 执行了命令后,放弃了所有的工作区的修改


# 放弃对指定文件的修改, 从缓存区里拉取的版本【不是工作区】还原本地无意修改的版本
$ git checkout –- filename


# 放弃工作区和暂存区的所有修改
$ git checkout -f

7.删除分支

$ git branch -d branchName #删除本地分支 branchName 
$ git push origin --delete branchName  #删除远程分支 branchName 

8.合并分支

#合并前要先切回要并入的分支,以下表示要把dev分支合并入master分支
$ git checkout master #切换到master分支
$ git merge dev #将dev合并到master分支

9.提交换行注释

#注释可以通过单引号来换行
$ git commit -m '
> 1.aaaaa
> 2.bbbb
'
$ git merge dev #将dev合并到master分支
$ git commit --amend #查看到刚刚的log信息为

10.添加和提交代码

#第一步:查看当前的git仓库状态
$ git status

#第二步:更新全部,你可以提出更改(把它们添加到暂存区)
$ git add *

#第三步:添加注释,使用如下命令以实际提交改动
# 你的改动已经提交到了 HEAD,但是还没到你的远端仓库。
$ git commit -m "更新说明"

# 第四步:先git pull --rebase,拉取当前分支最新代码
# 建议使用rebase操作会更好一点,这样可以线性的看到每一次提交,并且没有增加提交节点。
# 不加--rebase 特定情况下会出现冲突
$ git pull --rebase
# 或者将远程指定分支 拉取到 本地指定分支上:
# git pull origin <远程分支名>:<本地分支名>
# 注意: pull是远程在前,本地在后,push相反(本地在前,远程在后)
git pull origin master:test

#第五步:push到远程master分支上,执行如下命令以将这些改动提交到远端仓库:
git push origin master 
或 git push origin dev

# git push origin dev:master 好像只写这一句,远程会自动创建一个test分支
# git push origin <本地分支名 dev>:<远程分支master>
git push origin dev:master # 提交本地dev分支作为远程的master分支
git push origin test:test  # 提交本地test分支作为远程的test分支

# 提交本地develop_ice_1202分支作为远程origin下面的develop_ice_1202分支
git push origin develop_ice_1202:wt/develop_ice_1202

#git push origin master的意思就是上传本地当前分支代码到远程master分支。
#git push 是上传本地所有分支代码到远程对应的分支上

# 关于提交的其它说明
git push -u origin master #如远程仓库为空需加上-u这个参数
git push origin master

加了参数-u后,以后即可直接用git push代替git push origin master
意思就是我们不用在后面加 origin + 要提交的分支名 ,直接 git push 即可

但是前提是第一次提交需要加 -u参数后, 后面的提交就直接可以 git push
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:

git push --force origin master
  • git pull = git fetch + git merge FETCH_HEAD # merge 多用户提交时可能会导致冲突
  • git pull --rebase =  git fetch + git rebase FETCH_HEAD    #无冲突的问题
  • git add . 会把本地所有untrack的文件都加入暂存区,并且会根据.gitignore做过滤,
  • 但是git add * 会忽略.gitignore把任何文件都加入

11.查看log

$ git log #查看提交历史记录
$ git log --oneline #以精简模式显示
$ git log --pretty=oneline #以精简模式显示,即一个压缩后的每一条提交记录只占一行的输出
$ git log --author=bob #只看某一个人bob的提交记录
$ git log --name-status # 看看哪些文件改变了
$ git log --help #log更多的信息

12.撤销操作

$ git status #查看add 中的文件 
$ git reset HEAD #默认是上一次add 里面的全部撤销了 
$ git reset HEAD XXX.js #对某个文件进行撤销了

13.查看remote地址,远程分支,还有本地分支与之对应的关系等信息

$ git remote show origin

14.在本地删除远程不存在的分支

$ git remote prune origin

15.其它

#查看已安装的git版本
$ git --version 

# 要查看本地未提交的更改与已拉取的最新版本之间的差异,比如手动更改了拉取的代码,但未提交更新
$ git diff

# 替换本地改动,
# 假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动
$ git checkout -- <filename>
# 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。
# 已添加到暂存区的改动以及新文件都不会受到影响。

# 假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
$ git fetch origin #获取远程服务器的最新历史版本
$ git reset --hard origin/master # 本地分支指向它

# 如果想要删除仓库某个文件夹
# 第1步:先pull远程代码,保持同步
$ git pull --rebase

# 第2步:删除单个文件或文件夹
$ git rm 文件名 --cached  #删除文件
$ git rm -r 文件夹名 --cached # 删除文件夹

# 第3步:提交修改
$ git commit -m "备注信息"

# 第4步:推送
git push origin master

16.异常提交处理

git 执行git pull –rebase报错误如下:

error: Cannot pull with rebase: You have unstaged changes.
error: Additionally, your index contains uncommitted changes.

原因:如果有未提交的更改,是不能git pull的

解决:
先执行 git stash
再执行  git pull --rebase
最后再执行 git stash pop

参考资料

git 官方文档

git 中文文档