Git基础操作,看这篇就够了

634 阅读7分钟

Mac安装Git的三种方式

  • 安装 Xcode Command Line Tools
  • 在Git官网下载git客户端
  • 执行 brew install git

配置git

git config —global user.name 'Ying'
git config —global user.email 'xxx@email.com'
git config —global core.editor 'vim'

  • --global : 表示全局配置
  • user.name 和 user.email用于设置用户名和邮箱, git会使用这些信息记录各种操作
  • core.editor 用于设置git默认编辑器

创建一个仓库

  1. 创建一个文件夹, cd 到文件夹内, 执行git init
  2. 在文件夹中创建你的工程和文件,执行 git status来查看文件状态
  3. 可以接着执行 git add 文件名 / git add . 全部文件
  4. 为了把文件提交到仓库, 我们可以执行 git commit -m '注释'来提交
  5. 通过执行 git log 来查看提交日志, git在每次提交时都会生成一个对应的哈希值

将一个git仓库托管到GitHub

  1. 在GitHub上新建一个仓库
  2. 执行 git remote add origin github.com/GitHub用户名/仓…
  3. 执行 git push -u origin master
  4. 这时你的项目将被托管到GitHub

修改你的提交

在现实生活中我们可能会在Git操作时出现错误, 所以回撤你的提交是必备技能

我们和别人共享代码

如果我们已经把代码add 并且commit,并且push进仓库, 我们只能修改代码, 并且执行 add 和 commit操作来修复错误

自己本地管理代码时

我们可以使用 git reset 来撤销本次错误的提交,然后修改后再提交

我们可以执行
git reset --soft ae960b6382412a8290314168bbf8c67520732591(通过日志找到上次提交的版本对应的哈希值)

git reset --soft表示撤销本次提交,但是保留这次提交后对文件的修改

我们也可以执行
git reset --hard ae960b6382412a8290314168bbf8c67520732591

git reset --hard操作虽然会撤销这次提交, 但是它不会保留你在上次提交后继续写的代码,而是彻底回到了上次提交的版本,所以在平时我们是不会用这个命令的

创建分支, 使用分支来解决Bug和开发需求

在实际开发中, master分支的代码一定是最后经过审核验证,不会出问题的代码, 在开发中或者修复bug时, 我们最好是通过创建的分支来进行代码的管理;

  • git branch 来创建一个分支,分支的名称通常是反应这个分支的用途
例如创建一个feature-about分支, 用来进行需求的开发
git branch feature-about
  • git checkout 是将代码从master分支切到其他分支
将分支切换到 feature-about分支
git checkout feature-about

  • 创建和切换分支我们也可以通过更简单的操作来一起完成
这个操作 和 git branch 分支 + git checkout 分支 效果完全一致
git checkout -b feature-about
  • 当我们在分支上完全写好代码,进行 add . 和 commit 提交之后, 我们可以回到master分支,然后更新master分支
git checkout master
git add .
git commit -m '提交纪录说明'

在执行完上面的操作后, master和feature-about是两个平行的时间线了

合并分支

我们在分支上的代码已经全部经过测试,并且准备发布后, 我们自然要把分支的代码合并到master上来;

  • 首先我们要确定自己已经在master分支上
  • 执行合并操作 git merge 分支名,这时 git会打开默认编辑器, 让我们对这次合并做一个说明
按照我们笔记的案例, 我们应该执行
git merge feature-about

这时我们执行git log, 就能看到合并成功,以案例为准

执行
git log
会看到
commit +  提交版本的哈希值id + (HEAD -> master, feature-about)

此时, 两个分支时间线上的行为, 以发生时间为序合并到了一起

删除分支

现在, 分支就没有存在的意义了, 我们可以执行 git branch -d 分支名 把它删掉就好了

删除分支
git branch -d feature-about

处理分支合并时的冲突

出于某种原因, 我们经常会出现在两个分支上修改了同一处代码, 这时会产生冲突, 一般需要我们解决冲突后合并, 也可以取消这次合并;

创建一个分支, 并且切换到分支上
git checkout -b fixbug/doSomething

修改代码.....

执行git操作
git add .
git commit -m 'finish fix bug'

回到master
git checkout master

修改在fixbug/doSomething修改的相同地方的代码.....

执行git操作
git add .
git commit -m 'finish code change'

合并代码
git merge fixbug/doSomething

//此时,因为合并导致的冲突出现

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        view.backgroundColor = UIColor.red
        AF.request("https://www.geekbang.org/").response {
            response in
<<<<<<< HEAD
            debugPrint("这里打印response")
=======
            debugPrint("response -- \(response)")
>>>>>>> fixbug/doSomething
        }
    }
    

冲突解释:

  • <<<<<<< HEAD 到 ======= 之间的代码表示当前分支的代码
  • ======= 到 >>>>>>> fixbug/doSomething之前的代码表示在 fixbug/doSomething分支上做的事
  • 这个时候就需要我们自己做决定要留下哪个分支的代码, 然后将另外的代码和这些特殊符号删除
在删除代码后继续执行
git add .
git commit -m '注释说明'

这样, 合并冲突就轻而易举的解决了

stash临时缓存代码

之前我们说分支可以处理我们平时的功能开发和bug修复,当我们需要遇到突发情况在master分支修改代码时, 先提交我们在分支代码, 然后切回master, 在master上修改代码后再切换回分支继续写我们的代码; 但是这都是理想状态,在我们工作中, 可能当我们需要去master修改代码时, 分支的代码还不具备被提交的代码质量, 这时我们就需要用到stash缓存了

模拟 stash的使用

我们新建一个目录
执行 git init
然后创建一个index.md文件

然后执行 
git add .
git commit -m '注释'

然后创建分支
git checkout -b feature-about

然后在这个分支上 创建一个文件 git-stash.md文件
假设我们现在要回到master上修改东西,但是git-stash文件里的内容我们还不能提交, 如果现在我们回到master分支

执行
git status

会看到
Untracked files:
  (use "git add <file>..." to include in what will be committed)

git-stash.md

nothing added to commit but untracked files present (use "git add" to track)


<!--

但我们目前还不能把这些改变提交到 master上, 通常情况是我们要回到 feature-about分支,并且提交代码, 然后再回到master分支来修改东西;
在修改完东西后回到 feature-about分支, 
执行 git log
然后执行
git reset --soft 之前的提交版本的hash值回到当前提交的时间点上,继续代码开发, 但略显麻烦

-->

我们可以用git stash 临时缓存代码
如果我们此时执行 git stash
我们可能会看到 No local changes to save; 
what?, 这是什么鬼

这是因为git-stash.md 还是Untracker状态, 并没有进入索引区, git stash是将索引区转存起来, 所以我们需要先将其添加进索引区

所以应该执行
git add .
git stash
这时,才是正确的,成功将git-stash.md文件暂缓在 feature-about分支了

此时我们回到 master分支
git checkout master
我们再执行
git status
我们将在master分支看不到在分支 feature-about上的git-stash.md 文件的改动了

此时我们就可以在master上修改自己的需求,在完成后回到feature-about分支
执行
git stash list 查看缓存

我们可以执行
git stash apply stash{0}来恢复代码
我们也可以执行
git stash pop stash{0}来恢复代码并且清除缓存

场景分析:
假如我们在master分支上改好代码后,但由于操作失误,删除了 feature-about分支, 我们怎么办?
我们在master分支上
执行 git stash list会发现在feature-about分支上的stash还是存在的
此时,我们执行
git stash pop 现将缓存恢复到 master分支
然后执行
git stash branch feature-about git会用缓存的内容重新创建 feature-about 分支, 继续之前在feature-about上的工作;