Git for novice

本文最后更新于:Monday, December 28th 2020, 6:23 pm

1、Git and GitHub

Github 可以看成是一个基于Git的系统,它提供了仓库的可视化。是一个远程托管仓库。如果是public,其他人可以随意查看,修改。如果是private只有你自己可以查看了。如果为了安全,可以团队自己搭建一个git服务器。

Git大家都已经很熟悉了,分布式版本控制系统(Distributed version control system)

2、Why do we use git

  1. 可以更好地在GitHub上开发,分享啊。
  2. 多人协同开发。
  3. 版本控制,可以任意回滚到之前某个版本。

3、How do we use git

mark

场景1

在GitHub上看到一个不错的项目,想要研究,学习为目的。

  1. 先fork一份到自己的GitHub上。

  2. clone到本地

    -o 指定远程仓库的名字,否则默认为origin

    1
    2
    git clone [-b <指定分支名>]<远程仓库地址> [-o booyah]  
    默认是克隆所有分支。
  3. 进行自己的开发。修改文件后

    此时git status可以看到:修改过的文件红色标处。Untracked filesmark

    1
    git add ./[filename]			// 把修改过的文件添加到暂存区。

    mark

    此时文件变成绿色。即已经添加到了暂存区。

  4. 提交

    1
    git commit -m "添加文件的说明"			// 提交

    提交完成了,工作目录应该显示是空的。

  5. 推送到远程仓库

    1
    git push origin [branch name] 			// 推送到指定仓库的指定分支上。

    mark

场景2

自己新建一个仓库。做项目开发。

  1. 初始化一个本地仓库

    1
    git init xxx	// 新建一个名为xxx的仓库
  2. 进入仓库,然后就可以开发了。

    1
    cd  xxx 		// 此目录就是工程根目录。
  3. 如果要上传到GitHub上。即远端git服务器

    • 首先在GitHub上新建一个仓库。

    • 本地仓库与远程仓库建立联系。

      1
      git remote add origin <server>	// 与GitHub仓库建立联系. origin 可以换成任意名字。

      mark

      可以看到我通过origin pull不上去。因为我连接的是remote_name。

    • push到远程服务器上

      1
      git push origin master 			// 推送到远程服务器上

      如果是克隆远程仓库的话,那么可以跳过remote(因为本地master已经和远程master联系上了)。直接推送到远程服务器。

4、common commands1

1、branch(分支)

1、新建分支

1
2
git checkout -b xxx		// 新建分支并切换到xxx
git branch xxx // 只是新建一个分支,仍留在本地。(新建的分支复刻目分支)

git branch [-b branchName commitId] 从指定分支和commit号上开始新的分支

git branch -m old_branch new_branch 重命名本地分支

2、分支切换

1
2
git branch [-a]				//查看分支
git checkout xxx //切换到xxx分支

git branch 参数-a: 查看所有分支,包括远端的分支。 -v 查看分支指向的commit。 —remote查看远程分支

3、合并分支

  1. 先把你次要分支提交完全。

  2. 切换到你要合并其他分支的主分支上

  3. 合并

    1
    git merge test			// 在主分支上合并test分支

    mark

可以看到已经合并了test1分支。现在它们指向同一个commit。

如果遇到冲突,手动判断哪一个修改留下。

4、删除分支

1
2
3
4
5
6
git branch -d [branch name]

git push origin --delete [branch name] // 删除远程分支
$ git push origin --delete testing
To github.com:BeenLi/learn_git.git
- [deleted] testing

5、远程分支

1
2
3
4
5
6
7
8
9
10
11
$ git ls-remote		// 查看远程分支
$ git branch -r -v // 查看远程分支
From [email protected]:BeenLi/learn_git.git
6fc7758ee27a73196a81391efd803dc19541eb88 HEAD
6fc7758ee27a73196a81391efd803dc19541eb88 refs/heads/master
807b956e7a57eef2f148dc7cb5b14ae3992955e6 refs/heads/testing
807b956e7a57eef2f148dc7cb5b14ae3992955e6 refs/pull/1/head
998239f25772ea809310d9f92c9e96a67c158b82 refs/pull/1/merge

$ git remote show // 查看远程仓库名字
remote_name

“origin” 是当你运行 git clone 时默认的远程仓库名字

6、跟踪分支

1
2
3
4
5
6
7
git checkout -b [branch] [remotename]/[branch]

git checkout --track origin/serverfix // 快捷命令
当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master 的 master 本地分支

git branch --set-upstream-to origin/remoteBranchName localBranchName 修改远程分支
git branch --unset-upstream // 撤销跟踪远程分支

mark

可以看到 设置了分支test3 跟踪 远端的master分支。现在分支与master分支相同。

现在,本地分支 test 会自动从 remote_name/master 拉取。

1
2
3
4
5
6
7
8
9
$ git branch -vv
master 2b2be16 修改文件,制造合并冲突
test1 2b2be16 修改文件,制造合并冲突
test2 420f721 第二次本地提交
testing e051a6f [remote_name/testing: ahead 1] 测试追踪分支情况
* test3 4fdb7bd [remote_name/master] 测试本地提交

可以看到test3 是master的跟踪分支。
testing分支领先1。表示有本地有一个commit没有push到服务器上。

7、分支拉取

1
2
git pull  == git fetch + git merge
git fetch 不会修改当前工作区的文件。它只会获取数据然后让你自己合并。

8、上传分支

1
2
git push origin localbranch:remotebranch
如果添加了远程分支就直接push了。

2、reset (撤销)

参考🔗

mark

1、reset —hard

reset —hard:重置stage区和工作目录(会在重置 HEADbranch的同时,重置stage区和工作目录里的内容)

即回到上一次commit的位置。,全部清空。

2、reset —soft

reset —soft:保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区

即你之前commit的文件,退回到stage。需要重新提交。

3、reset [—mixed]

reset: 保留工作目录,并清空暂存区

也就是你要重新add,然后commit。

Reference

[1] 分支用法

[2] reset用法

[3] 简明教程

[4] 动态过程


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!